numba.njit处理自定义dtype的numpy数组报intrinsic-call/static-get-item错误
问题原因说明
这不是Numba不支持手动声明NumPy数组dtype,而是你对结构化数组的索引方式不符合Numba的实现规则。
你定义的dtypeS是带命名字段的结构化dtype,因此aa是结构化数组,aa[i]返回的是一个Record结构体对象而非普通数组,Numba没有为这类Record对象实现整数索引的取值逻辑,这就是报错中No implementation of function getitem for (Record, int64)的根本来源。
当你移除dtype参数时,NumPy会将输入obj1转换为普通二维数值数组,aa[i][0]的索引逻辑符合Numba的内置支持规则,因此可以正常运行。
解决方法
你可以根据自己的需求选择以下任意一种方案:
- 保留结构化dtype,改用字段名访问元素
如果你需要保留字段的命名语义,直接将按索引取值改为按字段名取值即可,示例修改如下:
也可以提前将字段提取为单独数组,性能更高:@numba.njit(fastmath = True) def func (aa, f1,f2,f3,f0,g1,g2,g3,g0): aa1 = numpy.empty(shape=(aa.shape[0],4)) for i in range(aa1.shape[0]): # 用字段名e访问第一个字段,其他字段对应换c、b、f即可 aa1[i][0] = aa[i]['e'] + f0 + g0e_arr = aa['e'] # 后续循环中直接访问e_arr[i] - 不需要字段语义的话,修改dtype定义
如果你只是需要存储每组4个整数的序列,不需要命名字段,可以直接将dtype定义为定长数值类型,避免生成结构化数组:# 每个元素是4个int32的数组,支持整数索引访问 dtypeS = '4int32' aa = numpy.array(obj1, dtype=dtypeS) - 显式声明dtype精度
定义结构化dtype时建议显式指定精度,不要直接用Python内置的int,避免不同平台下int长度不同导致的兼容问题:dtypeS = [('e', numpy.int32), ('c', numpy.int32), ('b', numpy.int32),('f', numpy.int32)]
内容的提问来源于stack exchange,提问作者user2625363
相关产品推荐
相关产品推荐

