Numba nopython模式布尔索引

时间:2017-10-24 11:41:03

标签: arrays numpy boolean-logic numba boolean-operations

我正在使用numba中的数组,有时会将inf或nan作为条目返回,然后我需要将其调整为零。我在nopython模式下工作,所以我想知道是否有一种方法可以使用布尔索引(或乘法)将数组中的任何nan或inf元素调整为零(数组形状为(vertex_number,1) ))。

显然我可以像这样循环遍历数组:

from numpy import isnan, isinf, array, zeros, nan, inf, ones

from numba import jit

v = ones((10, 1))

v[0] = nan
v[-1] = inf
print(v)

@jit(nopython=True, nogil=True)
def reciprocal_v(v):
    u = 1 / v
    for i in range(len(u)): # get rid of zero length reciprocals...
        if (isinf(u[i])[0] == True) | (isnan(u[i])[0] == True):
            u[i] = 0.0
    return u
u = reciprocal_v(v)
print(u)

我尝试了布尔乘法,但inf * 0返回nan,而nan * 0返回nan

@jit(nopython=True)
def numba_isnan(x): return isnan(x)

@jit(nopython=True)
def numba_isinf(x): return isinf(x)

@jit(nopython=True, nogil=True)
def reciprocal_v_bool(v):
    u = 1 / v
    u = u * ~(numba_isnan(u) | numba_isinf(u))
    return u

1 个答案:

答案 0 :(得分:2)

这不是numba的一个问题,而是numpy如何处理naninf(和numba遵循惯例)的乘法的结果。如果删除jit装饰器,则可以看到un-jitted函数返回相同的结果。此行为由IEEE 754等标准定义。

我会坚持使用你已经提出的解决方案。

另外,作为一般说明,您不需要以下功能:

@jit(nopython=True)
def numba_isnan(x): return isnan(x)

只需import numpy as np,然后在numba函数中使用np.isnan()。 Numba将识别numpy功能并用正确的形式替换它。