Dynamic Zero Padding для массивов NumPy
У меня есть K векторов объектов, которые все имеют размерность n, но имеют переменную размерность m (n x m). Они все живут в списке вместе.
to_be_padded = []
to_be_padded.append(np.reshape(np.arange(9),(3,3)))
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
to_be_padded.append(np.reshape(np.arange(18),(3,6)))
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17]])
to_be_padded.append(np.reshape(np.arange(15),(3,5)))
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
То, что я ищу, это умный способ обнулить строки этих np.arrays так, чтобы они все имели одинаковое измерение m. Я пытался решить его с помощью np.pad, но я не смог придумать красивое решение. Любая помощь или толчок в правильном направлении будет принята с благодарностью!
В результате массивы должны выглядеть следующим образом:
array([[0, 1, 2, 0, 0, 0],
[3, 4, 5, 0, 0, 0],
[6, 7, 8, 0, 0, 0]])
array([[ 0, 1, 2, 3, 4, 5],
[ 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17]])
array([[ 0, 1, 2, 3, 4, 0],
[ 5, 6, 7, 8, 9, 0],
[10, 11, 12, 13, 14, 0]])
2 ответа
Вы могли бы использовать np.pad
за то, что может также дополнить 2-D
массивы с использованием набора значений, определяющих ширину заполнения, ((top, bottom), (left, right))
, Для этого вы можете определить:
def pad_to_length(x, m):
return np.pad(x,((0, 0), (0, m - x.shape[1])), mode = 'constant')
использование
Вы можете начать с поиска ndarray
с наибольшим количеством столбцов. Скажем, у вас есть два из них, a
а также b
:
a = np.array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
b = np.array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
m = max(i.shape[1] for i in [a,b])
# 5
И затем используйте этот параметр, чтобы дополнить ndarrays
:
pad_to_length(a, m)
array([[0, 1, 2, 0, 0],
[3, 4, 5, 0, 0],
[6, 7, 8, 0, 0]])
Я считаю, что нет очень эффективного решения для этого. Я думаю, вам нужно перебрать список с помощью цикла for и обработать каждый массив индивидуально:
for i in range(len(to_be_padded)):
padded = np.zeros((n, maxM))
padded[:,:to_be_padded[i].shape[1]] = to_be_padded[i]
to_be_padded[i] = padded
где maxM
самый длинный m
из матриц в вашем списке.