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