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。
在较新的 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
快。