如何解决使用numba进行特殊功能
此代码失败:
import numpy as np
from numba import jit
import scipy.special as sp
@jit(nopython=True)
def f(a):
return sp.xlogy(a,a)
a = np.array([1,2,1],dtype=float)
f(a)
出现以下错误
TypingError: Failed in nopython mode pipeline (step: nopython frontend)
Unknown attribute 'xlogy' of type Module(<module 'scipy.special' from '/home/yair/.local/lib/python3.8/site-packages/scipy/special/__init__.py'>)
但是,我认为它应该起作用,因为它说here可能会使xlogy
超载。 answer from 2015表示无法完成此操作(对于某些其他功能),但也许我认为它已更改。
当然,我可以自己实现它,但是使用已知的解决方案会很好。
编辑:
根据以下Andras Deak的建议,我尝试使用numba-scipy
。我无法使其正常工作,并希望提供一些用法示例。这是我的尝试-均失败,请参见以下错误:
import numpy as np
from numba import jit
import numba_scipy
import scipy as sp
from scipy import special as spc
@jit(nopython=True)
def f1(a):
return numba_scipy.special.xlogy(a,a)
@jit(nopython=True)
def f2(a):
return numba_scipy.xlogy(a,a)
@jit(nopython=True)
def f3(a):
return sp.special.xlogy(a,a)
@jit(nopython=True)
def f4(a):
return spc.xlogy(a,a)
a = np.array([0,1,2])
try:
f1(a)
except Exception as e:
print('f1 fails')
print(e)
try:
f2(a)
except Exception as e:
print('f2 fails')
print(e)
try:
f3(a)
except Exception as e:
print('f3 fails')
print(e)
try:
f4(a)
except Exception as e:
print('f4 fails')
print(e)
完整的错误消息:
/home/yair/.local/lib/python3.8/site-packages/numba/core/dispatcher.py:238: UserWarning: Numba extension module 'numba_scipy' failed to load due to 'ValueError(No function '__pyx_fuse_0pdtr' found in __pyx_capi__ of 'scipy.special.cython_special')'.
entrypoints.init_all()
f1 fails
Failed in nopython mode pipeline (step: nopython rewrites)
module 'numba_scipy' has no attribute 'special'
f2 fails
Failed in nopython mode pipeline (step: nopython rewrites)
module 'numba_scipy' has no attribute 'xlogy'
f3 fails
Failed in nopython mode pipeline (step: nopython frontend)
Unknown attribute 'xlogy' of type Module(<module 'scipy.special' from '/home/yair/.local/lib/python3.8/site-packages/scipy/special/__init__.py'>)
File "example.py",line 19:
def f3(a):
return sp.special.xlogy(a,a)
^
During: typing of get attribute at example.py (19)
File "example.py",a)
^
f4 fails
Failed in nopython mode pipeline (step: nopython frontend)
Unknown attribute 'xlogy' of type Module(<module 'scipy.special' from '/home/yair/.local/lib/python3.8/site-packages/scipy/special/__init__.py'>)
File "example.py",line 23:
def f4(a):
return spc.xlogy(a,a)
^
During: typing of get attribute at example.py (23)
File "example.py",a)
^
解决方法
由于您在评论中遇到安装问题,因此我特别建议您使用numba本身(numba-scipy)的创建者使用的link to pypi。对包使用第一方扩展始终是一个好主意。
very documentation you linked与numba_special
相关。如果您查看main page,将会看到第一个示例:
>>> import numba
>>> import scipy.special as sc
>>> import numba_special # The import generates Numba overloads for special
>>> @numba.njit
... def gamma_plus_1(x):
... return sc.gamma(x) + 1.0
...
>>> gamma_plus_1(5.0)
25.0
请注意您缺少的import numba_special
行。
您还必须先安装numba-special。还要注意项目页面上的警告:
,安装
Numba的特殊性取决于SciPy和Numba。在Numba版本中包含this issue的修复程序之前,必须在Numba的主分支上安装numba_special。
您正在从scipy.special调用xlogy函数,实际上,对于@jit装饰的函数调用的函数也需要进行@jit装饰。 这就是为什么xlogy与您的f函数和numba投掷错误不兼容的原因。解决方法可能是:
import numpy as np
from numba import jit
@jit(nopython=True)
def myxlogy(x,y):
return x*np.log(y)
@jit(nopython=True)
def f(a):
return myxlogy(a,a)
a = np.array([1,2,1],dtype=float)
f(a)
>>array([0.,1.38629436,nan,0. ])
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。