用填充堆叠numpy数组

时间:2018-10-30 19:01:59

标签: python arrays numpy

我有一个32个numpy数组的列表,每个数组的形状为(n, 108, 108, 2),其中n在每个数组中都是不同的。我想将它们全部堆叠起来以创建一个形状为(32, m, 108, 108, 2)的numpy数组,其中mn中的最大值,而较短的数组将填充零。

我该怎么做?

我昨天问过something similar,但是当像我这样使用深数组时,答案似乎就中断了。

最后,我最终采用了此解决方案,该解决方案生成了最干净的代码:

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

但是现在它抛出此错误:

ValueError: setting an array element with a sequence.

4 个答案:

答案 0 :(得分:2)

在我的情况下,我需要堆叠宽度不同的图像,并在左侧填充零。 对我来说,这很好:

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)

答案 1 :(得分:1)

尝试一下:

# 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堆叠零点数组以使其符合新形状。

答案 2 :(得分:0)

我在this webpage中找到了一个敬虔的答案。

pad_sequences功能正是我所需要的。

from tensorflow.python.keras.preprocessing.sequence import pad_sequences
result = pad_sequences(imgs, padding='post')

答案 3 :(得分:0)

v-data-table