Python/Numba:使用Numba扩展API创建自定义类型时遇到问题

Python/Numba:使用Numba扩展API创建自定义类型时遇到问题,python,api,numpy,numba,Python,Api,Numpy,Numba,我正在尝试创建一个自定义的Numba类型。我在将Numba Numpy数组装箱和取消装箱到本机Numpy数组时遇到问题 我在网上搜索过类似的问题,并尽我所能地遵循文档示例。(). 我试过解释(),但很难。因此,我想我可能做错了一些小事 下面是我当前在自定义类型中包含Numpy数组的尝试 将numpy导入为np 从numba导入类型,cgutils 从numba.extensing import typeof_impl,type_callable,models 从numba.extensing

我正在尝试创建一个自定义的Numba类型。我在将Numba Numpy数组装箱和取消装箱到本机Numpy数组时遇到问题

我在网上搜索过类似的问题,并尽我所能地遵循文档示例。().

我试过解释(),但很难。因此,我想我可能做错了一些小事

下面是我当前在自定义类型中包含Numpy数组的尝试

将numpy导入为np
从numba导入类型,cgutils
从numba.extensing import typeof_impl,type_callable,models
从numba.extensing import register\u model,生成\u属性\u包装器,重载\u属性
从numba.extending导入下_内置、取消装箱、NativeValue、方框
B类矩阵(对象):
"""
二进制矩阵的空包装器
"""
定义初始(self,m,n,行索引):#,列索引):
self.m=m
self.n=n
self.row\u index=row\u index
#self.col\u i=col\u索引
定义报告(自我):
返回'BMatrix(%d,%d)'%(self.m,self.n)
@财产
def形状(自):
返回(self.m,self.n)
类bmatrix类型(类型.Type):
定义初始化(自):
super(BMatrix类型,self)。\uuuu init\uuuu(name='BMatrix')
bmatrix_type=bmatrix type()
@输入寄存器类型(BMatrix)
def类型索引(val,c):
返回bmatrix\u类型
@类型_可调用(BMatrix)
def类型矩阵(上下文):
def打字机(m、n、行索引):
if(isinstance(m,types.Integer)
和isinstance(n,类型.Integer)
和isinstance(行索引,nb.types.Array)):
#和isinstance(col_索引,nb.types.Array)):
返回bmatrix\u类型
返回式打字机
@寄存器_模型(bMatrix类型)
类BMatrixModel(models.StructModel):
def_uuu初始_uuu(自、dmm、fe_类型):
成员=[
('m',type.int64),
('n',type.int64),
('row_index',types.Array(types.int64,1,'C'))
]
models.StructModel.\uuuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
生成属性包装器(bmatrix类型'm','m')
生成属性包装器(bmatrix类型,'n','n')
生成属性包装器(bmatrix类型、“行索引”、“行索引”)
@重载_属性(bmatrix类型,“形状”)
def get_形状(b矩阵):
def吸气剂(bmatrix):
返回(bmatrix.m,bmatrix.n)
回程吸气剂
@lower_内置(BMatrix,types.Integer,types.Integer,types.Array)#nb.types.Array,#nb.types.Array)
def impl_bmatrix(上下文、生成器、信号、参数):
类型=信号返回类型
m、 n,行索引=args
bmatrix=cgutils.create_struct_proxy(典型)(上下文,生成器)
b矩阵m=m
b矩阵n=n
bmatrix.row_index=row_index
返回bmatrix.\u getvalue()
@取消装箱(bMatrix类型)
def unbox_bmatrix(典型、obj、c):
"""
将BMatrixType对象转换为本机间隔结构。
"""
m_obj=c.pyapi.object_getattr_字符串(obj,“m”)
n_obj=c.pyapi.object_getattr_字符串(obj,“n”)
row_index_obj=c.pyapi.object_getattr_字符串(obj,“row_index”)
BMatrix=cgutils.create_struct_proxy(典型)(c.context,c.builder)
BMatrix.m=c.pyapi.long\u as\u longlong(m\u obj)
BMatrix.n=c.pyapi.long\u as\u longlong(n\u obj)
BMatrix.row_index=nb.targets.boxing.unbox_数组(types.array(types.int64,1,'C'),
行(索引对象,c)
c、 pyapi.decref(m_obj)
c、 pyapi.decref(n_obj)
c、 pyapi.decref(行索引对象)
is\u error=cgutils.is\u not\u null(c.builder,c.pyapi.err\u occurrent())
返回NativeValue(BMatrix.\u getvalue(),is\u error=is\u error)
@盒子(Bmatrix类型)
def盒B矩阵(典型、val、c):
"""
将本机bmatrix结构转换为bmatrix对象。
"""
Bmatrix=cgutils.create_struct_proxy(典型)(c.context,c.builder,value=val)
m_obj=c.pyapi.long_from_longlong(Bmatrix.m)
n_obj=c.pyapi.long_from_longlong(Bmatrix.n)
row_index_obj=nb.targets.boxing.box_数组(types.array(types.int64,1,'C'),
Bmatrix.row_索引,c)
class_obj=c.pyapi.unserialize(c.pyapi.serialize_对象(Bmatrix))
res=c.pyapi.call_function_objargs(class_obj,(m_obj,n_obj))
c、 pyapi.decref(m_obj)
c、 pyapi.decref(n_obj)
c、 pyapi.decref(行索引对象)
c、 pyapi.decref(类对象)
返回res
测试用例(对于测试2和测试3,错误回溯绝对是巨大的)

@nb.jit(nopython=True)
def test_1():#运行
x=BMatrix(10,10,np.数组([10,10,10]))
def测试_2():#错误
x=BMatrix(10,10,np.数组([10,10,10]))
@注意:jit(nopython=True)
def_测试_2(y):
返回y
返回测试2(x)
@注意:jit(nopython=True)
def test_3():#错误
返回BMatrix(10,10,np.数组([10,10,10]))
@注意:jit(nopython=True)
def测试_4():
返回BMatrix(10,10,np.数组([10,10,10])。行索引
这些是我运行测试用例时的错误

test_1()#运行
test_2()
---------------------------------------------------------------------------
AttributeError回溯(最近一次呼叫上次)
在里面
---->1测试_2()
在测试_2()中
9返回y
10
--->11返回测试2(x)
12@nb.jit(nopython=True)
13 def测试_3():
//anaconda3/lib/python3.7/site-packages/numba/dispatcher.py in_compile_for_args(self,*args,**kws)
368 e.patch_消息(''.join(e.args)+help_消息)
369 35;忽略完整的_回溯配置,这需要报告!
-->370升e
371
372 def inspect_llvm(自身,签名=无):
//anaconda3/lib/python3.7/site-packages/numba/dispatcher.py in_compile_for_args(self,*args,**kws)
325 argtypes.append(self.typeof_pyval(a))
326请尝试:
-->327返回self.compile(元组(argtypes))
328错误除外。打字机错误为e:
329#截取可能由参数引起的键入错误
//巨蟒A3/lib