Python 当ak.Array子类的属性依赖于Numba编译函数时,如何解决TypingErrors?

Python 当ak.Array子类的属性依赖于Numba编译函数时,如何解决TypingErrors?,python,numpy,numba,awkward-array,Python,Numpy,Numba,Awkward Array,我仔细阅读了笨拙的1回购协议中的文档和演示笔记本(我完全可能错过了一些明显的东西),但我已经进入了一个陌生的领域,希望得到一些帮助 假设我在极坐标系中有点,我使用awkward1库将这些点作为记录数组提供给用户。一些用户可能更喜欢使用笛卡尔坐标系中的点,因此我可以通过添加行为来适应这些点,下面的示例可以工作 将awkward1导入为ak 将numpy作为np导入 类:笛卡尔(对象): “”“要从极坐标转换为笛卡尔坐标的Mixin类。”“” @财产 def x(自我): 返回self.r*np.c

我仔细阅读了笨拙的1回购协议中的文档和演示笔记本(我完全可能错过了一些明显的东西),但我已经进入了一个陌生的领域,希望得到一些帮助

假设我在极坐标系中有点,我使用awkward1库将这些点作为记录数组提供给用户。一些用户可能更喜欢使用笛卡尔坐标系中的点,因此我可以通过添加行为来适应这些点,下面的示例可以工作

将awkward1导入为ak
将numpy作为np导入
类:笛卡尔(对象):
“”“要从极坐标转换为笛卡尔坐标的Mixin类。”“”
@财产
def x(自我):
返回self.r*np.cos(self.theta)
#和y类似,但这只是一个例子
#用笨拙的语言记录这些行为
类点(ak.Record,Polar2Cartesian):
通过
类PointArray(ak.Array,Polar2笛卡尔):
通过
ak.行为['Point']=点
ak.behavior['*','Point']=PointArray
#定义点
r=np.数组([2.53,0.29,3.18])
θ=np.数组([np.pi/4,np.pi,-np.pi/3])
points=ak.zip({'r':r,'theta':theta},带_name='Point')
#第一点的x分量
点[0].x==r[0]*np.cos(θ[0])#真
#所有点的x分量
点x==r*np.cos(θ)#
现在假设转换必须使用Numba编译函数。我在下面的示例中定义了一个,但原则上它可以来自我无法控制的第三方库。下面的代码适用于单个记录,但会在记录数组上引发TypingError

将awkward1导入为ak
进口麻木为nb
将numpy作为np导入
@nb.njit
def cos(x):
“”“出现一个人为的示例。”“”
返回np.cos(x)
类:笛卡尔(对象):
“”“要从极坐标转换为笛卡尔坐标的Mixin类。”“”
@财产
def x(自我):
return self.r*cos(self.theta)#在这里使用jitted函数
#和y类似,但这只是一个例子
#像以前一样定义和注册行为,并创建
#与上一示例中相同的点阵列
#这仍然有效
点[0].x==r[0]*np.cos(θ[0])#真
#这就产生了一个打字员
点x==r*np.cos(θ)
分析回溯可以发现TypingError的原因:

TypingError:无法解析类型(awkward1.ArrayView(awkward1.numpyaryType(数组(float64,1d,A),none,{},none,()),)的ufunc cos

这是公平的,因为期望Numba知道如何在没有开发人员帮助的情况下使用这种类型是不合理的

我发现的一种解决方法是在
Polar2Cartesian.x
的定义中调用
np.asarray()
,即
cos(np.asarray(self.theta))
。尽管
cos
返回一个NumPy数组,
Polar2Cartesian.x
由于随后与
self.r
相乘,最终成为一个笨拙的数组。通常,可以根据需要将返回值转换为一个笨拙的记录或数组

但是这个解决方案是“笨拙的1批准”,还是我应该走为θ和x提供打字机和更低功能作为附加行为的路线?如果是后者,有人能教我如何正确书写打字机和更低的函数吗

在这一点上,我想知道我的问题标题的范围是否太广。如果有人有更好的建议,请告诉我