Python 如何在jitclass中创建numpy数组列表

Python 如何在jitclass中创建numpy数组列表,python,numpy,numba,Python,Numpy,Numba,我想创建一个JIT类,它将存储一些numpy数组。我不知道到底有多少。所以我想创建一个numpy数组列表。 我对麻木类型感到困惑,但找到了一些奇怪的解决方案。 这是正常的 import numba from numba import types, typed, typeof from numba.experimental import jitclass import numpy as np spec = [ ('test', typeof(typed.List.empty_list(

我想创建一个JIT类,它将存储一些numpy数组。我不知道到底有多少。所以我想创建一个numpy数组列表。 我对麻木类型感到困惑,但找到了一些奇怪的解决方案。 这是正常的

import numba
from numba import types, typed, typeof
from numba.experimental import jitclass
import numpy as np


spec = [
    ('test', typeof(typed.List.empty_list(numba.int64[:])))
]

@jitclass(spec)
class myLIST(object):
    def __init__ (self, haha=typed.List.empty_list(numba.int64[:])):
        self.test = haha
        self.test.append(np.asarray([0]))

    def dump(self):
        self.test.append(np.asarray([1]))
        print(self.test)

a = myLIST()
a.dump()
但当我删除冗余变量时,它失败了

spec = [
    ('test', typeof(typed.List.empty_list(numba.int64[:])))
]

@jitclass(spec)
class myLIST(object):
    def __init__ (self):
        self.test = typed.List.empty_list(numba.int64[:])
        self.test.append(np.asarray([0]))

    def dump(self):
        self.test.append(np.asarray([1]))
        print(self.test)

a = myLIST()
a.dump()

为什么会发生这种情况?

似乎将数组类型声明为
nb.int64[:]
并不能提供足够的信息来创建类,除非您创建一个实例(Numba可以用来推断类型的
haha
的默认值)

相反,您可以声明:

int_vector = nb.types.Array(dtype=nb.int64, ndim=1, layout="C")
spec = [('test', nb.typeof(nb.typed.List.empty_list(int_vector)))]
或更短:

int_vector = nb.types.Array(dtype=nb.int64, ndim=1, layout="C")
spec = [('test', nb.types.ListType(int_vector))]
或者,如果可以使用类型注释:

int_vector = nb.types.Array(dtype=nb.int64, ndim=1, layout="C")

@nb.experimental.jitclass
class my_list:

    test: nb.types.ListType(int_vector)

    def __init__(self):
        self.test = nb.typed.List.empty_list(int_vector)
        self.test.append(np.array([0]))

    def dump(self):
        self.test.append(np.array([1]))
        print(self.test)

a = my_list()
a.dump()