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

Numba jitclass使用列表字典变量报错,寻求解决方案

解决Numba jitclass中使用类字典等长列表数据的问题

问题根源

你的代码报错主要有三个核心原因:

  • spec中使用了抽象的types.Record类型,Numba需要具体的结构化类型定义,而非抽象类型
  • 构造的结构化数组是2维的,但spec声明的是1维数组,维度不匹配
  • 原始数据的构造方式不符合结构化数组要求,导致数组结构异常

修正方案

1. 定义具体的Numba结构化类型

替换抽象的types.Record,手动构建与numpy dtype完全匹配的具体结构化类型。

2. 匹配数组维度与spec声明

确保传入jitclass的数组维度和spec中声明的一致,或调整spec适配数组维度。

3. 正确构造结构化数组

结构化数组的每个元素应对应一个包含所有字段的元组,而非二维列表形式。

完整修正代码

import numpy as np
from numba.experimental import jitclass
from numba import types

# 1. 定义具体的结构化类型
v_type = types.int64
v2_type = types.float64
struct_type = types.Record.make_struct([('v', v_type), ('v2', v2_type)])

spec = [
    ('data', types.Array(struct_type, 1, layout='C'))  # 声明1维数组,匹配后续构造的数组结构
]

@jitclass(spec)
class Test:
    def __init__(self, data):
        self.data = data

    def loop(self):
        v = self.data['v']
        v2 = self.data['v2']
        print("Inside loop:")
        print("v:", v)
        print("v2:", v2)

# 2. 正确构造结构化数组:每个元素是包含v和v2字段的元组
data = [(1, 1.0), (2, 2.0), (3, 3.0)]

dtype = np.dtype([
    ('v', np.int64),
    ('v2', np.float64)
])

data_array = np.array(data, dtype=dtype)

print("Original data array:")
print(data_array)

# 创建实例并测试功能
test = Test(data_array)
test.loop()

运行结果

Original data array:
[(1, 1.) (2, 2.) (3, 3.)]
Inside loop:
v: [1 2 3]
v2: [1. 2. 3.]

若需要二维结构化数组

如果业务场景确实需要使用2维结构化数组,只需调整spec的维度声明,并构造对应结构的二维数据:

# 修改spec为2维数组声明
spec = [
    ('data', types.Array(struct_type, 2, layout='C'))
]

# 构造二维结构化数据
data_2d = [[(1, 1.0), (2, 2.0)], [(3, 3.0), (4, 4.0)]]
data_array_2d = np.array(data_2d, dtype=dtype)

test_2d = Test(data_array_2d)
test_2d.loop()

内容的提问来源于stack exchange,提问作者tompal18

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 09:31:02