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

时间:2015-12-14 16:01:29

标签: python numpy

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

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

1 个答案:

答案 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不同,但bAshapestridesmean等属性大致相同

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