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 数组的函数的主要内容,如果未能解决你的问题,请参考以下文章

在 numba 中使用 numpy.vstack

对于纯 numpy 代码,使用 numba 的收益在哪里?

为啥在迭代 NumPy 数组时 Cython 比 Numba 慢得多?

尝试使用 numba 循环 numpy 数组时出错

各种 numpy 花式索引方法的性能,也与 numba

如何使用numba加快以下代码的速度?