numba 不编译带有 numpy 数组的函数
Posted
技术标签:
【中文标题】numba 不编译带有 numpy 数组的函数【英文标题】:numba does not compile a function with numpy arrays 【发布时间】:2020-10-27 10:37:50 【问题描述】:这是我的功能
def _hargreaves_samani_02(r0, im, tmax, tmin, tavg):
"""
r0 and im are numpy 1D array dtype=int32
tmax, tmin, tavg are numpy 1D array dtype=float32
"""
et = np.empty(tmax.size, np.float32)
for i in range(et.size):
et[i] = r0[im[i]] * (tmax[i] - tmin[i])**0.5 + 0.0023 * (tavg[i] + 17.78)
return et
当我尝试使用 @jit(nopython=True) 时出现以下错误 - 但使用 @jit(forceobj=True) 时没有错误-
etd = BHIMES._hargreaves_samani_02(sr, 月, tmax, tmin, tavg) _compile_for_args 中的文件“C:\Users\solis\Anaconda3\lib\site-packages\numba\dispatcher.py”,第 351 行 error_rewrite(e, '打字') 文件“C:\Users\solis\Anaconda3\lib\site-packages\numba\dispatcher.py”,第 318 行,在 error_rewrite 重新加注(类型(e),e,无) 文件“C:\Users\solis\Anaconda3\lib\site-packages\numba\six.py”,第 658 行,在 reraise raise value.with_traceback(tb)
numba.errors.TypingError:在 nopython 模式管道中失败(步骤:nopython 前端) Function() 与类型参数的无效使用:(array(float32, 1d, C), int64, array(float64, 1d, C))
参数化 在定义 0 中: 所有模板都被文字拒绝。 在定义 1 中: 所有没有文字的模板都被拒绝。 在定义 2 中: 所有模板都被文字拒绝。 在定义 3 中: 所有没有文字的模板都被拒绝。 在定义 4 中: 所有模板都被文字拒绝。 在定义 5 中: 所有没有文字的模板都被拒绝。 在定义 6 中: 所有模板都被文字拒绝。 在定义 7 中: 所有没有文字的模板都被拒绝。 此错误通常是由于传递了指定函数不支持的类型的参数引起的。 [1] 期间:在 C:\Users\solis\Documents\DEV\python3\Recarga\bhimes\bhimes.py (442) 处键入 setitem
文件“bhimes.py”,第 442 行: def _hargreaves_samani_02(r0, im, tmax, tmin, tavg): 对于我在范围内(et.size): et[i] = r0[int(im[i])] * (tmax[i] - tmin[i])**0.5 + 0.0023 * (tavg[i] + 17.78) ^
这通常不是 Numba 本身的问题,而是通常由 使用不受支持的功能或解析类型时出现问题。
列表项
【问题讨论】:
r0[im[i]]
索引可能太复杂了。
尝试在循环外删除r0[im]
索引,甚至在函数外删除。
【参考方案1】:
我尝试过测试数据,但我传递给函数的参数有问题;因此这段代码可以正常工作
from numba import jit, float32, int32, void
@jit(void(float32[:], int32[:], float32[:],float32[:],float32[:],float32[:]), python=True)
def hargreaves_samani(r0, im, tmax, tmin, tavg, et):
for i in range(et.size):
et[i] = 0.0023 * (tavg[i] + 17.78) + r0[im[i]] * (tmax[i] - tmin[i])**0.5
【讨论】:
以上是关于numba 不编译带有 numpy 数组的函数的主要内容,如果未能解决你的问题,请参考以下文章