You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 + g0
    
    也可以提前将字段提取为单独数组,性能更高:
    e_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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 11:18:03