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

uho*_*hoh 2 numpy python-2.7

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

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

f(a[0,0]) # fails
f(b[0][0]) # works
Run Code Online (Sandbox Code Playgroud)

失败给出错误信息:

类型错误:bpy_struct:item.attr = val:int 类型的预期序列项,而不是 numpy.int64

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

hpa*_*ulj 5

它可能有助于区分数组存储在其数据缓冲区中的内容以及它通过索引返回的内容。

a=np.arange(6,dtype=int).reshape(2,3)
Run Code Online (Sandbox Code Playgroud)

它的属性, a.__array_interface__

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

这些值存储在 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'}
Run Code Online (Sandbox Code Playgroud)

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

type(a[0,0])  # numpy.int32
type(a[0,0].item()) # int
type(int(a[0,0])  # int
Run Code Online (Sandbox Code Playgroud)

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]]
Run Code Online (Sandbox Code Playgroud)

  • _因为_ `a[0, 0]` 是“类数组”,当然可以在 ** 索引之后应用 `tolist`:`a[0, 0].tolist()` _will_ 返回一个 `int` . (有趣的是,这意味着 `tolist` 并不总是返回一个 `list`。想想那个。)当然,`a[0, 0].item()` 和 `int(a[0, 0]) ` 两者都更擅长揭示正在发生的事情的意图。 (2认同)