为什么我的 numpy 数组元素被转换为列表?

问题描述 投票:0回答:1
import numpy as np

ar1 = np.array([[[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]]])
ar2 = np.array([[[1,2,3],[4,5,6]],[[1,2,3,4],[4,5,6,7]]])

print(ar1)
print(ar2)

当我运行此命令时,第二个数组会打印出来,并在元素周围进行 list() 转换。以下是 print() 结果:

[[[1 2 3] [4 5 6]]

[[1 2 3] [4 5 6]]]

[[列表([1,2,3])列表([4,5,6])] [列表([1,2,3,4])列表([4,5,6,7])]]

出于某种原因,一维数组是否都需要具有相同的长度?如果它们的长度不同,我是否必须将它们转换为数组?

我使用的是 Python 版本 3.8.10。

arrays python-3.x numpy multidimensional-array casting
1个回答
0
投票

在较新的 numpy 版本中,您的代码会产生错误:

In [157]: ar1 = np.array([[[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]]])
     ...: ar2 = np.array([[[1,2,3],[4,5,6]],[[1,2,3,4],[4,5,6,7]]])
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Cell In[157], line 2
      1 ar1 = np.array([[[1,2,3],[4,5,6]],[[1,2,3],[4,5,6]]])
----> 2 ar2 = np.array([[[1,2,3],[4,5,6]],[[1,2,3,4],[4,5,6,7]]])

ValueError: setting an array element with a sequence. The requested array has an inhomogeneous shape after 2 dimensions. The detected shape was (2, 2) + inhomogeneous part.

再试一次,但使用明确的数据类型:

In [158]: ar2 = np.array([[[1,2,3],[4,5,6]],[[1,2,3,4],[4,5,6,7]]],dtype=object)

In [159]: ar2
Out[159]: 
array([[list([1, 2, 3]), list([4, 5, 6])],
       [list([1, 2, 3, 4]), list([4, 5, 6, 7])]], dtype=object)

注意形状。一种是带有整数元素的 3d,另一种是带有列表元素的 2d:

In [160]: ar1.shape, ar2.shape
Out[160]: ((2, 2, 3), (2, 2))

如果列表长度不一致,则无法创建 3d 数值数组。对于

object
dtype,这个数组更像是一个列表,包含对存储在内存中其他位置的列表的引用。对这样的数组进行数学运算是偶然的,而且不如
ar1
快。

© www.soinside.com 2019 - 2024. All rights reserved.