当子列表长度不同时,np.array
退回到创建一个object dtype
array:
In [272]: a = np.array([[1,2,3], [4,5,9, 8]])
In [273]: a
Out[273]: array([[1, 2, 3], [4, 5, 9, 8]], dtype=object)
这个数组与我们开始时的列表类似。两者都将子列表存储为指针。子列表存在于内存中的其他位置。
使用等长的子列表,它可以创建一个包含整数元素的二维数组:
In [274]: a2 = np.array([[1,2,3], [4,5,9]])
In [275]: a2
Out[275]:
array([[1, 2, 3],
[4, 5, 9]])
事实上,为了证实我的说法,即子列表存储在内存中的其他位置,让我们尝试更改一个:
In [276]: alist = [[1,2,3], [4,5,9, 8]]
In [277]: a = np.array(alist)
In [278]: a
Out[278]: array([[1, 2, 3], [4, 5, 9, 8]], dtype=object)
In [279]: a[0].append(4)
In [280]: a
Out[280]: array([[1, 2, 3, 4], [4, 5, 9, 8]], dtype=object)
In [281]: alist
Out[281]: [[1, 2, 3, 4], [4, 5, 9, 8]]
在这种情况下这是行不通的a2
. a2
有自己的数据存储,独立于源列表。
基本点是np.array
尝试尽可能创建一个 n 维数组。如果不能,它就会返回创建对象数据类型数组。而且,正如其他问题中所讨论的那样,它有时会引发错误。有意创建对象数组也很棘手。
形状为a
很容易,(2,)。单个元素元组。a
是一个一维数组。但这种形状并不能传达有关元素的信息a
。元素也是如此alist
. len(alist)
是 2。对象数组可以具有更复杂的形状,例如a.reshape(1,2,1)
,但它仍然只包含指针
a
包含2个4字节指针;a2
包含 6 个 4 字节整数。
n [282]: a.itemsize
Out[282]: 4
In [283]: a.nbytes
Out[283]: 8
In [284]: a2.nbytes
Out[284]: 24
In [285]: a2.itemsize
Out[285]: 4