在数组中的数组中重塑数组

4 投票
2 回答
11918 浏览
提问于 2025-04-18 14:23

我有一个包含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 值和一块数据。

但是在对象数组中,每个对象都有自己的 shapedata

撰写回答