在数组中的数组中重塑数组
我有一个包含40个数组的数组,每个数组的形状是1行150列。有没有办法把这些数组重新调整成40个3行50列的数组呢?
我不太确定是否可以用np.reshape这个方法一次性完成,能做到吗?
2 个回答
5
在处理一个包含其他numpy数组的numpy数组时,我发现这个方法很有用。你可以先用 b=np.hstack(array_of_arrays)
来把这些数组合并成一个一维的numpy数组,然后再对这个 b
进行重新形状调整。
8
这真的是一个包含 np.arrays 的 array
吗,还是一个包含这些数组的列表呢?如果它是一个数组,那么它的形状和数据类型是什么?
如果它是一个列表,或者是一个 dtype=object
的数组,那么你需要逐个处理里面的项目,并且重新调整每个项目的形状。
[a.reshape(3,50) for a in A]
如果你有一个三维数组,它的形状可能是 (40, 1, 150)
。
A.reshape(40, 3, 50)
由于在一个“对象”数组中的项目可以是任何东西——字符串、数组、列表、字典——所以不能对它们进行一次性的 reshape
。即使它们都是数组,它们的维度也可能各不相同。实际上,这通常就是数组中包含数组的情况。
In [5]: np.array([[1,2,3],[2,3]])
Out[5]: array([[1, 2, 3], [2, 3]], dtype=object)
你需要采取特别的步骤来构建一个对象数组,使得里面的所有项目都有相同的形状。np.array
会尽量构建出它能做到的最高维度的数组。
In [7]: A=np.empty((2,),dtype=object)
In [8]: A[0] = np.array([1,2,3])
In [9]: A[1] = np.array([4,5,6])
In [10]: A
Out[10]: array([array([1, 2, 3]), array([4, 5, 6])], dtype=object)
换个角度来看:reshape
只是改变了数组的一个属性。它对数据本身没有任何影响。在三维数组的情况下,只有一个 shape
值和一块数据。
但是在对象数组中,每个对象都有自己的 shape
和 data
。