首页 > 解决方案 > 在 numba 与 numpy 中访问结构化数据类型

问题描述

我注意到如何numbanumpy允许访问具有结构化数据类型的数组的不同子字段之间存在差异。我正在测试访问子字段和数组的一些函数的以下定义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的数组的某种单独表示。不幸的是,在JIT 函数numpy中检查对象的类型或属性并不容易。numba

这是numba和普通之间的故意区别吗?numpy访问结构化数据类型的首选方式是numba什么?

我使用的是numba0.48.0 版。

标签: pythonnumpytypesnumba

解决方案


推荐阅读