使用内置int的dtype创建和使用NumPy数组

时间:2015-08-09 15:05:08

标签: python-2.7 numpy

我正在使用其他地方的方法,它需要内置类型的整数int,而不是NumPy创建的类型。这是一个简化:

a = np.arange(6, dtype='int').reshape(2,3)
b = a.tolist()

f(a[0,0]) # fails
f(b[0][0]) # works

fail出现错误消息:

  

TypeError:bpy_struct:item.attr = val:的预期序列项   输入int,而不是numpy.int64

虽然tolist()有效但我在此过程中失去了NumPy。我的问题是,我可以使用内置类型的int维护NumPy形式和灵活性吗?

1 个答案:

答案 0 :(得分:3)

可能有助于区分数据缓冲区中存储的数据与通过索引返回的数据。

a=np.arange(6,dtype=int).reshape(2,3)

其属性a.__array_interface__

{'strides': None,
 'descr': [('', '<i4')],
 'shape': (2, 3),
 'data': (171366744, False),
 'version': 3,
 'typestr': '<i4'}

这些值存储为24字节(6 * 4),从data内存位置开始。

a[0,0]不仅仅是数据缓冲区的4个字节。它实际上是一个单项0d数组。从技术上讲,它的类型是np.int32,但它有许多与np.ndarray相同的属性和方法:

In [431]: a[0,0].__array_interface__
Out[431]: 
{'strides': None,
 'descr': [('', '<i4')],
 'shape': (),
 '__ref': array(0),
 'data': (171093512, False),
 'version': 3,
 'typestr': '<i4'}

.item()方法可用于从数组对象中提取该值。在许多情况下,int32可以像Python原型int一样使用,但显然你的功能很挑剔,执行某种isinstance(i,int)测试。

type(a[0,0])  # numpy.int32
type(a[0,0].item()) # int
type(int(a[0,0])  # int

a.tolist()[0][0]因为该数组方法旨在构建一个嵌套的Python基元列表,剥离了所有ndarray属性。实际上它在最低级别.item()。实际上是:

In [444]: [[j.item() for j in i] for i in a]
Out[444]: [[0, 1, 2], [3, 4, 5]]