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
相关产品推荐
相关产品推荐

