有人可以解释 Numpy 的设计决策,即保持数组的单个元素与 Python 标量不同吗?
下面的代码工作没有错误
import numpy as np
a = np.array([1, 2, 3])
b = a[0]
print(b.size)
Run Code Online (Sandbox Code Playgroud)
这说明这b不是一个简单的 Python 标量,实际上type(b)给出了numpy.int32而不是int.
当然,如果定义了b = 1,命令b.size会抛出错误,因为
AttributeError: 'int' 对象没有属性 'size'
我发现这种行为差异令人困惑,我想知道它的动机是什么。
数组元素与索引时获得的对象之间存在差异。
该数组有一个数据缓冲区。它是 numpy 使用自己的编译代码管理的字节块。单个元素可以用 1 个字节、4 个、8 个、16 个等表示。
In [478]: A=np.array([1,2,3])
In [479]: A.__array_interface__
Out[479]:
{'data': (167487856, False),
'descr': [('', '<i4')],
'shape': (3,),
'strides': None,
'typestr': '<i4',
'version': 3}
Run Code Online (Sandbox Code Playgroud)
以字节列表形式查看数据(显示为字符):
In [480]: A.view('S1')
Out[480]:
array(['\x01', '', '', '', '\x02', '', '', '', '\x03', '', '', ''],
dtype='|S1')
Run Code Online (Sandbox Code Playgroud)
当你选择一个元素时,A你会得到一个单元素数组(或类似的东西):
In [491]: b=A[0]
In [492]: b.shape
Out[492]: ()
In [493]: b.__array_interface__
Out[493]:
{'__ref': array(1),
'data': (167480104, False),
'descr': [('', '<i4')],
'shape': (),
'strides': None,
'typestr': '<i4',
'version': 3}
Run Code Online (Sandbox Code Playgroud)
该type是不同的,但b有大部分相同的属性为A,shape,strides,mean,等。
您必须使用.item来访问底层的“标量”:
In [496]: b.item()
Out[496]: 1
In [497]: type(b.item())
Out[497]: int
Run Code Online (Sandbox Code Playgroud)
因此,您可以将其b视为带有numpy包装器的标量。在__array_interface__对b看起来非常像的np.array(1)。
| 归档时间: |
|
| 查看次数: |
1167 次 |
| 最近记录: |