如何在Numba(Python)中比较标量值和数组?

如何在Numba(Python)中比较标量值和数组?,python,arrays,pandas,numpy,numba,Python,Arrays,Pandas,Numpy,Numba,如何在Numba(Python)中比较标量值和数组? 我有一个函数,它必须把一维和二维数组作为参数。在函数中,我必须检查每行的实际值是否为NaN。我用numpy函数np.isnan来实现。此函数为1-D阵列和2-D阵列提供标量。不幸的是,Numba无法处理这个问题。 如何检查数组的行在一维或二维数组中是否具有NaN值? 我是否必须编写3个函数:主函数,然后将其委托给一维数组或二维数组的函数 import numpy as np import numba as nb @nb.jit([nb.flo

如何在Numba(Python)中比较标量值和数组? 我有一个函数,它必须把一维和二维数组作为参数。在函数中,我必须检查每行的实际值是否为NaN。我用numpy函数np.isnan来实现。此函数为1-D阵列和2-D阵列提供标量。不幸的是,Numba无法处理这个问题。 如何检查数组的行在一维或二维数组中是否具有NaN值? 我是否必须编写3个函数:主函数,然后将其委托给一维数组或二维数组的函数

import numpy as np
import numba as nb
@nb.jit([nb.float64[:](nb.float64[:]), nb.float64[:,:](nb.float64[:,:])], nopython=True)
def is_not_nan_in_array_or_scalar(x):
    result = np.full_like(x, np.NaN)
    is_not_nan = ~np.isnan(x) if x.ndim==1 else ~np.isnan(x.flatten())
    for i in range(0, len(x)):
        if is_not_nan[i]:
            # do something...
            result[i] = is_not_nan[i]
    return result

print(is_not_nan_in_array_or_scalar(np.array([1,2.5,np.NaN])))
print(is_not_nan_in_array_or_scalar(np.array([[1],[2.5],[np.NaN]])))
结果应该是:

[ 1.  1. nan]
[[ 1.]
 [ 1.]
 [nan]]
这是使用Numba时出现的错误:

TypingError: Failed in nopython mode pipeline (step: nopython frontend)
Cannot unify array(bool, 2d, C) and array(bool, 1d, C) for '$phi50.1', defined at <ipython-input-6-2bd50d9143ab> (6)

File "<ipython-input-6-2bd50d9143ab>", line 6:
def is_not_nan_in_array_or_scalar(x):
    <source elided>
    result = np.full_like(x, np.NaN)
    is_not_nan = ~np.isnan(x) if x.ndim==1 else ~np.isnan(x.flatten())
    ^

[1] During: typing of assignment at <ipython-input-6-2bd50d9143ab> (6)

File "<ipython-input-6-2bd50d9143ab>", line 6:
def is_not_nan_in_array_or_scalar(x):
    <source elided>
    result = np.full_like(x, np.NaN)
    is_not_nan = ~np.isnan(x) if x.ndim==1 else ~np.isnan(x.flatten())
    ^
TypingError:在nopython模式管道中失败(步骤:nopython前端)
无法为在(6)中定义的“$phi50.1”统一数组(bool,2d,C)和数组(bool,1d,C)
文件“”,第6行:
def在数组或标量(x)中不是nan:
结果=np.full_-like(x,np.NaN)
如果x.ndim==1,则为~np.isnan=~np.isnan(x),否则为~np.isnan(x.flatten())
^
[1] 期间:在(6)处键入作业
文件“”,第6行:
def在数组或标量(x)中不是nan:
结果=np.full_-like(x,np.NaN)
如果x.ndim==1,则为~np.isnan=~np.isnan(x),否则为~np.isnan(x.flatten())
^

它在Numba 0.47上对我有效。你用什么版本?Rutger Kassies,你已经搞定了。我使用的是0.45.1版,它不能与Numba decorator一起工作。更新之后,就没有问题了。非常感谢您花时间解决我的问题。它在Numba 0.47上对我有效。你用什么版本?Rutger Kassies,你已经搞定了。我使用的是0.45.1版,它不能与Numba decorator一起工作。更新之后,就没有问题了。非常感谢你花时间解决我的问题。