为什么单个 Numpy 数组元素不是 Python 标量?

div*_*nex 5 python numpy

有人可以解释 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'

我发现这种行为差异令人困惑,我想知道它的动机是什么。

hpa*_*ulj 5

数组元素与索引时获得的对象之间存在差异。

该数组有一个数据缓冲区。它是 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有大部分相同的属性为Ashapestridesmean,等。

您必须使用.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)