我正在使用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
答案 0 :(得分:2)
这不是numba的一个问题,而是numpy如何处理nan
和inf
(和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功能并用正确的形式替换它。