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])?
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()给出阵列类型的更多信息.
嗯,我同意其他答案,当他们说hstack或concatenate在这种情况下做工作.但是,我想指出,即使它"修复"了问题,问题也没有得到妥善解决.
问题是即使看起来第二轴的长度不同,实际上也不是这样.如果你试试:
>>> 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列表.
| 归档时间: |
|
| 查看次数: |
4744 次 |
| 最近记录: |