Dynamic Zero Padding для массивов NumPy - PullRequest
0 голосов
/ 08 февраля 2019

У меня есть K векторов пространственных объектов, которые все имеют размерность n, но имеют переменную размерность m (nxm).Они все живут в списке вместе.

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 ]

0 голосов
/ 08 февраля 2019

Вы можете использовать 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]])
0 голосов
/ 08 февраля 2019

Я считаю, что для этого не существует очень эффективного решения.Я думаю, вам нужно перебрать список с помощью цикла 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 матриц в вашем списке.

...