我正在使用其他地方的方法,它需要内置类型的整数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形式和灵活性吗?
答案 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]]