将numpy嵌套数组重新整形为数组

时间:2018-04-29 16:17:13

标签: python arrays numpy

我有一个numpy数组,形状像

a1.shape
# 1000
a1[0].shape
# (100, 100, 3)

我想以

的方式改变形状
a1.shape
# (1000, 100, 100, 3)

我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:0)

只需发布解决方案以防任何人需要

x = []
for fname in fl1:
    x.append( np.array(Image.open(fname)))

for i in range(0, len(x)):
  x[i] = imresize(x[i], [100,100], interp='bilinear')   

y = np.array(x)
y.shape

答案 1 :(得分:0)

列出具有不同形状(但元素数量相同)的数组:

In [72]: alist = [np.ones((2,3),int),np.zeros(6,int),np.arange(6)]
In [73]: alist
Out[73]: 
[array([[1, 1, 1],
        [1, 1, 1]]), array([0, 0, 0, 0, 0, 0]), array([0, 1, 2, 3, 4, 5])]
In [74]: np.array(alist)
Out[74]: 
array([array([[1, 1, 1],
       [1, 1, 1]]), array([0, 0, 0, 0, 0, 0]),
       array([0, 1, 2, 3, 4, 5])], dtype=object)

结果是一个对象dtype数组。

但是如果我们将列表的所有元素重塑为相同的形状,我们会得到一个3d数组:

In [75]: np.array([x.reshape(2,3) for x in alist])
Out[75]: 
array([[[1, 1, 1],
        [1, 1, 1]],

       [[0, 0, 0],
        [0, 0, 0]],

       [[0, 1, 2],
        [3, 4, 5]]])

现在让我们在制作数组后尝试重塑元素:

In [76]: arr = np.array(alist)
In [77]: arr.shape
Out[77]: (3,)
In [78]: for i in range(3):
    ...:     arr[i] = arr[i].reshape(2,3)
    ...:     
In [79]: arr
Out[79]: 
array([array([[1, 1, 1],
       [1, 1, 1]]),
       array([[0, 0, 0],
       [0, 0, 0]]),
       array([[0, 1, 2],
       [3, 4, 5]])], dtype=object)
In [80]: np.array(arr)
Out[80]: 
array([array([[1, 1, 1],
       [1, 1, 1]]),
       array([[0, 0, 0],
       [0, 0, 0]]),
       array([[0, 1, 2],
       [3, 4, 5]])], dtype=object)

在该阵列上调用array不会改变任何内容。

但是stack确实有用(stack只是concatenate的方便版本):

In [82]: np.stack(arr)
Out[82]: 
array([[[1, 1, 1],
        [1, 1, 1]],

       [[0, 0, 0],
        [0, 0, 0]],

       [[0, 1, 2],
        [3, 4, 5]]])

stack获取数组列表,或者它是一个数组,迭代第一维:

In [83]: np.stack([x for x in arr])
Out[83]: 
array([[[1, 1, 1],
        [1, 1, 1]],

       [[0, 0, 0],
        [0, 0, 0]],

       [[0, 1, 2],
        [3, 4, 5]]])