首页 > 解决方案 > 将numpy嵌套数组重塑为数组

问题描述

我有一个形状喜欢的 numpy 数组

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

我想改变形状

a1.shape
# (1000, 100, 100, 3)

我怎样才能做到这一点?

标签: pythonarraysnumpy

解决方案


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

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]]])

推荐阅读