我最近开始使用 numpy 并注意到一件奇怪的事情。
import numpy as np
a = np.array([[1,2,3], [4,5,9, 8]])
print a.shape, "shape"
print a[1, 0]
Run Code Online (Sandbox Code Playgroud)
在这种情况下,形状是2L。但是,如果我将同质 numpy 数组设为
a = np.array([[1,2,3], [4,5,6]],则a.shape给出(2L, 3L)。我知道非同质数组的形状很难表示为元组。
此外,print a[1,0]对于我之前创建的非同质数组,给出了回溯IndexError: too many indices for array。对同质数组执行相同操作会返回正确的元素4。
注意到这两个特性,我很想知道 python 如何在低级别上看待非同质 numpy 数组。先感谢您
当子列表的长度不同时,np.array则退回到创建object dtype数组:
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)
Run Code Online (Sandbox Code Playgroud)
这个数组与我们开始时的列表类似。两者都将子列表存储为指针。子列表存在于内存中的其他位置。
使用等长的子列表,它可以创建一个包含整数元素的二维数组:
In [274]: a2 = np.array([[1,2,3], [4,5,9]])
In [275]: a2
Out[275]:
array([[1, 2, 3],
[4, 5, 9]])
Run Code Online (Sandbox Code Playgroud)
事实上,为了证实我的说法,即子列表存储在内存中的其他位置,让我们尝试更改一个:
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]]
Run Code Online (Sandbox Code Playgroud)
在 的情况下这是行不通的a2。 a2有自己的数据存储,独立于源列表。
基本点是np.array尽可能创建一个 nd 数组。如果不能,它就会返回创建对象数据类型数组。而且,正如其他问题中所讨论的那样,它有时会引发错误。有意创建对象数组也很棘手。
的形状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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
11852 次 |
| 最近记录: |