如何展平一个2d numpy数组,它在第二轴上有不同的长度?

xir*_*uru 12 python arrays numpy

我有一个numpy数组,看起来像:

myArray = np.array([[1,2],[3]])
Run Code Online (Sandbox Code Playgroud)

但我无法压扁它,

In: myArray.flatten()
Out: array([[1, 2], [3]], dtype=object)
Run Code Online (Sandbox Code Playgroud)

如果我在第二轴上将数组更改为相同的长度,那么我可以将其展平.

In: myArray2 = np.array([[1,2],[3,4]])
In: myArray2.flatten()
Out: array([1, 2, 3, 4])
Run Code Online (Sandbox Code Playgroud)

我的问题是:

我可以使用一些东西,myArray.flatten()无论数组的大小和元素的长度,并得到输出:array([1,2,3])

mir*_*ulo 9

myArray是一维对象数组.您的列表对象将与flatten()or 保持相同的顺序ravel().您可以使用hstack水平顺序堆叠数组:

>>> np.hstack(myArray)
array([1, 2, 3])
Run Code Online (Sandbox Code Playgroud)

请注意,这基本上等同于使用concatenate轴为1(这应该是直观的):

>>> np.concatenate(myArray, axis=1)
array([1, 2, 3])
Run Code Online (Sandbox Code Playgroud)

如果您没有此问题并且可以合并项目,则始终最好使用flatten()ravel()表现:

In [1]: u = timeit.Timer('np.hstack(np.array([[1,2],[3,4]]))'\
   ....: , setup = 'import numpy as np')
In [2]: print u.timeit()
11.0124390125

In [3]: u = timeit.Timer('np.array([[1,2],[3,4]]).flatten()'\
   ....: , setup = 'import numpy as np')
In [4]: print u.timeit()
3.05757689476
Run Code Online (Sandbox Code Playgroud)

Iluengo的回答还为您提供了有关为何不能使用flatten()ravel()给出阵列类型的更多信息.


Ima*_*ngo 8

嗯,我同意其他答案,当他们说hstackconcatenate在这种情况下做工作.但是,我想指出,即使它"修复"了问题,问题也没有得到妥善解决.

问题是即使看起来第二轴的长度不同,实际上也不是这样.如果你试试:

>>> myArray.shape
(2,)
>>> myArray.dtype
dtype('O')    # stands for Object
>>> myArray[0]
[1, 2]
Run Code Online (Sandbox Code Playgroud)

它向您显示您的数组不是具有可变大小的2D数组(您可能认为),它只是一维对象数组.在您的情况下,元素是list数组的第一个元素是2元素列表,数组的第二个元素是1元素列表.

因此,flatten并且ravel将无法工作,因为将1D阵列转换为1D阵列会产生完全相同的1D阵列.如果你有一个objectnumpy数组,它将不关心你放在里面的内容,它会将单个项目视为未知项目,并且无法决定如何合并它们.

您应该考虑的是,这是您的应用程序所需的行为.Numpy数组对于固定大小的数字矩阵特别有效.如果你正在玩对象数组,我不明白你为什么要使用Numpy而不是常规的python列表.

  • @xirururu,但我想说的是,你的数组不是2D.如果你尝试`myArray + myArray`,结果是`array([[1,2,1,2],[3,3]],dtype = object)`我很确定这不是你所期望的.为了使用`+`,`-`和`sum`,你需要使你的数组​​成为数字,为此,它应该是固定的大小. (4认同)