我注意到numba
和numpy
如何允许访问具有结构化数据类型的数组的不同子字段之间存在差异。我正在测试对访问子字段和数组a
的一些函数的以下定义:
import numba
import numpy
@numba.njit
def func_numba(a):
return a[5].field0
def func_numpy(a):
return a[5].field0
def func_numpy_recarray(a):
return numpy.rec.array(a)[5].field0
a = numpy.zeros(10, dtype=[('field0', 'i4'), ('field1', 'f8')])
a['field0'] = numpy.arange(10)
# array([(0, 0.), (1, 0.), (2, 0.), (3, 0.), (4, 0.), (5, 0.), (6, 0.),
# (7, 0.), (8, 0.), (9, 0.)],
# dtype=[('field0', '<i4'), ('field1', '<f8')])
即使相同功能的“普通”版本不起作用,调用不同的功能也表明func_numba
版本有效:
func_numba(a)
# 5
func_numpy(a)
# AttributeError: 'numpy.void' object has no attribute 'field0'
func_numpy_recarray(a)
# 5
通过属性访问子字段的选项通常仅由numpy
记录数组提供,如功能func_numpy_recarray
所示,因此我假设numba
具有numpy
数组的某种单独表示形式为它们定义了不同的操作。不幸的是,在numba
JIT函数中检查对象的类型或属性并不容易。
这是numba
与普通numpy
之间的故意区别,并且在numba
中访问结构化数据类型的首选方式是什么?
我正在使用numba
0.48.0版。
我注意到numba和numpy如何允许访问具有结构化数据类型的数组的不同子字段之间存在差异。我正在测试访问...