Штабелирование массивов с набивкой - PullRequest
0 голосов
/ 30 октября 2018

У меня есть список из 32 пустых массивов, каждый из которых имеет форму (n, 108, 108, 2), где n отличается в каждом массиве. Я хочу собрать их все вместе, чтобы создать простой массив формы (32, m, 108, 108, 2), где m - максимум среди n с, а более короткие массивы дополняются нулями.

Как мне это сделать?

Я спросил что-то похожее вчера, но ответы там, кажется, ломаются при использовании глубоких массивов, как в моем случае.

Конкретно, в конце концов я пошел с этим решением, которое дало самый чистый код:

data = np.column_stack(zip_longest(*data, fillvalue=0))

Но теперь выдает эту ошибку:

ValueError: setting an array element with a sequence.

Ответы [ 3 ]

0 голосов
/ 30 октября 2018

Я нашел благочестивый ответ на этой веб-странице .

Функция pad_sequences - это именно то, что мне нужно.

from tensorflow.python.keras.preprocessing.sequence import pad_sequences
result = pad_sequences(imgs, padding='post')
0 голосов
/ 12 февраля 2019

В моем случае мне нужно было складывать изображения различной ширины и дополнять нулями с левой стороны. для меня это хорошо работает:

np.random.seed(42)
image_batch = []
for i in np.random.randint(50,500,size=10):
image_batch.append(np.random.randn(32,i))
for im in image_batch:
    print(im.shape)

вывод: (32, 152) (32, 485) (32, 398) (32, 320) (32, 156) (32, 121) (32, 238) (32, 70) (32, 152) (32, 171)

def stack_images_rows_with_pad(list_of_images):
    func = lambda x: np.array(list(zip_longest(*x, fillvalue=0))) # applied row wise
    return np.array(list(map(func, zip(*list_of_images)))).transpose(2,0,1)

res = stack_images_rows_with_pad(image_batch)

for im in rez:
    print(im.shape)

вывод: (32, 485) (32, 485) (32, 485) (32, 485) (32, 485) (32, 485) (32, 485) (32, 485) (32, 485) (32, 485)

0 голосов
/ 30 октября 2018

Попробуйте это:

# Create matrices with random first axis length.
depth = np.random.randint(3,20,size=32)
l = []
lmax = 0
for i in depth:
    l.append(np.ones((i,10,10,2)))
    lmax = i if i > lmax else lmax

# Join the matrices:
new_l = []
for m in l:
    new_l.append(np.vstack([m, np.zeros((lmax-m.shape[0], 10, 10, 2))]))
master = np.stack(new_l, axis=0)
master.shape
>>> (32, 19, 10, 10, 2)

Я считаю, np.pad почти невозможно работать с матрицами более высокого измерения - к счастью, то, что вы спросили, было простым, когда нужно было расширить только одно измерение, так что np.vstack легко использовать для укладки нулей массив, который придает ему новую форму.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...