Python Numba:矢量化标准SciPy-ufunc';s和numpy.sum()语法错误

Python Numba:矢量化标准SciPy-ufunc';s和numpy.sum()语法错误,python,numpy,numba,Python,Numpy,Numba,我对使用numba比较陌生,我希望使用它使我的数组计算尽可能高效。该函数是numba文档中几个概念的组合 我正在使用Scipy库中的酉函数 scipy.special.eval_laguerre(n,x,out=None)= 在点n处计算拉盖尔多项式L_n(x) 问题1:Numba文档明确说明了如何使用decorator@vectorize优化用户编写的ufunc 对于python库提供的ufunc,是否有一个标准过程来实现这一点 问题2:我想对数组中n个值的数组中矩阵的每个条目计算L_n(x)

我对使用
numba
比较陌生,我希望使用它使我的数组计算尽可能高效。该函数是numba文档中几个概念的组合

我正在使用Scipy库中的酉函数

scipy.special.eval_laguerre(n,x,out=None)=

在点n处计算拉盖尔多项式L_n(x)

问题1:Numba文档明确说明了如何使用decorator
@vectorize
优化用户编写的ufunc

对于python库提供的ufunc,是否有一个标准过程来实现这一点

问题2:我想对数组中n个值的数组中矩阵的每个条目计算L_n(x)。然后,我必须使用以下表达式对这些值求和:

result=np.sum([eval_laguerre(n,矩阵)表示数组中的n],axis=0)

其中我使用了
导入numpy作为np

如果我使用广播,我会评估:

result=np.sum(eval_laguerre(数组[:,无,无],矩阵),axis=0)

其中
轴=0
表示要求和的维度

我想使用“@jit”来编译此部分,但我不确定该过程用于
'numpy.sum()
。目前,上面带有
@jit
表达式的表达式出现语法错误

result = np.sum( eval_laguerre( array[:, None, None], matrix ), axis=0)
                                                                  ^
SyntaxError: invalid syntax
使用
@jit
np.sum()的正确方法是什么

编辑:响应@hpaulj:

我的想法是
numba
可以优化for循环,即

for n in array: 
    eval_laguerre(n, matrix)

这可能吗?如果不是使用
numba
,那么使用什么<代码>Pyran

让我们更具体一些:

示例数组,我将用于
n
x
(您可以选择更真实的值):

该版本充分利用了ufunc的广播能力

In [790]: special.eval_laguerre(A[:,None,:],A[None,:,:]).shape
Out[790]: (3, 3, 4)
或求和:

In [784]: np.sum(special.eval_laguerre(A[:,None,:],A[None,:,:]),0)
Out[784]: 
array([[  3.00000000e+00,  -1.56922399e-01,  -4.86843034e-01,
          7.27719156e-02],
       [  1.37460317e+00,  -4.47492284e+00,   5.77714286e+00,
         -9.71780654e-01],
       [ -1.76222222e+01,   7.00178571e+00,   5.55396825e+01,
         -1.32810866e+02]])
总和内的列表压缩等效:

In [785]: np.sum([special.eval_laguerre(n,A) for n in A],0)
Out[785]: 
array([[  3.00000000e+00,  -1.56922399e-01,  -4.86843034e-01,
          7.27719156e-02],
       [  1.37460317e+00,  -4.47492284e+00,   5.77714286e+00,
         -9.71780654e-01],
       [ -1.76222222e+01,   7.00178571e+00,   5.55396825e+01,
         -1.32810866e+02]])
或显式循环:

In [786]: x=np.zeros_like(A)    
In [787]: for n in A:
    x += special.eval_laguerre(n, A)
最后一个版本有机会使用
numba
进行编译

在简单的时间测试中,ufunc广播速度更快:

In [791]: timeit np.sum([special.eval_laguerre(n,A) for n in A],axis=0)
10000 loops, best of 3: 84.8 µs per loop

In [792]: timeit np.sum(special.eval_laguerre(A[:,None,:],A[None,:,:]),0)
10000 loops, best of 3: 43.9 µs per loop

我的猜测是,numba版本将在理解版本和显式循环上有所改进,但可能不会比广播版本更快

大多数(如果不是全部)的
numba
示例不都涉及Python for循环吗?它可以翻译和编译您自己的代码。它对现有的Python和numpy函数没有任何作用,尤其是那些已经用C编写的函数。
eval_laguerre
sum
已经编译完毕;numba没有可重写的Python代码。@hpaulj请参阅我上面的编辑。谢谢。我从没想过要做那些测试。呵呵。这让我很惊讶。一般来说,广播速度更快。这并不能回答最初的问题:“如何将
numba.vectorize
与已编写的UFUNC一起使用?”部分答案总比没有好:
In [791]: timeit np.sum([special.eval_laguerre(n,A) for n in A],axis=0)
10000 loops, best of 3: 84.8 µs per loop

In [792]: timeit np.sum(special.eval_laguerre(A[:,None,:],A[None,:,:]),0)
10000 loops, best of 3: 43.9 µs per loop