当某些int列表为空时,如何将int列表传递给jitclass?

2024-09-29 03:31:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图创建一个包含int列表的jitclass函数

我尝试了各种场景(如下面的示例所示),但总有一个错误: ValueError:无法键入空列表

问题是有时我需要int列表为空,这会导致错误

import numpy as np
from numba import jitclass,jit,njit,typeof
from numba import boolean, int32, float64,uint8

# spec1 = [
#     ('list_int' ,int32[:]),
#     ('list_float' ,float64[:]),]

# spec1 = [
#     ('list_int' ,typeof([[],[1,2],[1,2,3,4,5,],[]])),
#     ('list_float' ,typeof([[3.2],[],[3.3,6.8,5.],[]]))]

spec1 = [
    ('list_int'   ,typeof(tuple([[],[1,2],[1,2,3,4,5,],[]]))),
    ('list_float' ,typeof(tuple([[3.2],[],[3.3,6.8,5.],[]])))]

@jitclass(spec1)
class example():
    def __init__(self, list_int, list_float):
        self.list_int          = list_int
        self.list_float     = list_float


list_intA = [[],[1,2],[1,2,3,4,5,],[]]
list_floatB = [[3.2],[],[3.3,6.8,5.],[]]

# my_ex = example( list_intA ,
#                  list_floatB )

my_ex = example( tuple([np.array(l, dtype=np.int32) for l in list_intA]) ,
                 tuple([np.array(l, dtype=np.float64) for l in list_floatB]) )

# my_ex = example(np.array([np.array(l, dtype=np.int32) for l in list_intA]),
#                 np.array([np.array(l, dtype=np.int32) for l in list_floatB]))

Tags: inforexamplenpfloatarraylistint
1条回答
网友
1楼 · 发布于 2024-09-29 03:31:33

我最终找到了一个解决办法。传递给JIT类的类型不正确

import numpy as np
from numba import jitclass,jit,njit,typeof, types,typed

spec1 = [
    ('list_int'   , types.List(typeof(np.array([], dtype=np.int32)))),
    ('list_float'   , types.List(typeof(np.array([], dtype=np.float64)))),
        ]


@jitclass(spec1)
class example():
    def __init__(self, list_int, list_float  ):
        self.list_int          = list_int
        self.list_float          = list_float


list_intA = [[],[1,2],[1,2,3,4,5,],[-1]]
list_floatB = [[],[1.,2.],[1.,2.,3.,4.,5.,],[-1.]]

my_ex = example( [np.array(l, dtype=np.int32) for l in list_intA],
                 [np.array(l, dtype=np.float64) for l in list_floatB])

相关问题 更多 >