Numba nopython 模式布尔索引

Numba nopython mode boolean indexing

提问人:stagermane 提问时间:10/24/2017 更新时间:10/24/2017 访问量:1295

问:

我正在使用 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
数组 numpy boolean-logic numba boolean-operations

评论

0赞 B. M. 10/24/2017
不只是 : ?if (isinf(u[i,0]) | (isnan(u[i,0]))

答:

2赞 JoshAdel 10/24/2017 #1

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

我会坚持你已经想出的解决方案,这是有效的。

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

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

只是然后在 numba 函数中使用。Numba 将识别 numpy 函数并将其替换为正确的形式。import numpy as npnp.isnan()