提问人:stagermane 提问时间:10/24/2017 更新时间:10/24/2017 访问量:1295
Numba nopython 模式布尔索引
Numba nopython mode boolean indexing
问:
我正在使用 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
答:
2赞
JoshAdel
10/24/2017
#1
这不是 numba 的问题,而是 numpy 如何处理 and 的乘法的结果(numba 遵循约定)。如果删除装饰器,则可以看到 un-jitted 函数返回相同的结果。此行为由 IEEE 754 等标准定义。nan
inf
jit
我会坚持你已经想出的解决方案,这是有效的。
另外,作为一般说明,您不需要以下函数:
@jit(nopython=True)
def numba_isnan(x): return isnan(x)
只是然后在 numba 函数中使用。Numba 将识别 numpy 函数并将其替换为正确的形式。import numpy as np
np.isnan()
下一个:ruby 中布尔数组的最终逻辑值
评论
if (isinf(u[i,0]) | (isnan(u[i,0]))