有人可以解释Numpy的设计决策,以保持数组的单个元素与Python标量不同吗?
以下代码无误地运行
import numpy as np
a = np.array([1, 2, 3])
b = a[0]
print(b.size)
这说明b
不是一个简单的Python标量,事实上type(b)
会提供numpy.int32
而不是int
。
当然,如果定义b = 1
,则命令b.size
会抛出错误,因为
AttributeError:'int'对象没有属性'size'
我发现这种行为的混乱令人困惑,我想知道它的动机是什么。
答案 0 :(得分:4)
数组元素与索引数据时获得的对象之间存在差异。
该数组有一个数据缓冲区。它是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}
将数据视为字节列表(显示为字符):
In [480]: A.view('S1')
Out[480]:
array(['\x01', '', '', '', '\x02', '', '', '', '\x03', '', '', ''],
dtype='|S1')
当您选择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}
type
不同,但b
与A
,shape
,strides
,mean
等属性大致相同
您必须使用.item
来访问基础&#39;标量&#39;
In [496]: b.item()
Out[496]: 1
In [497]: type(b.item())
Out[497]: int
因此,您可以将b
视为带有numpy
包装器的标量。 __array_interface__
的{{1}}看起来非常像b
。{/ p>