Логическое индексирование в режиме Numba nopython

Я работаю с массивами в 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

person stagermane    schedule 24.10.2017    source источник
comment
Разве не просто : if (isinf(u[i,0]) | (isnan(u[i,0])) ?   -  person B. M.    schedule 24.10.2017


Ответы (1)


Это не проблема с numba, но вместо этого это результат того, как numpy обрабатывает умножение nan и inf (и numba следует соглашению). Если вы удалите декоратор jit, вы увидите, что функция без джиттинга возвращает тот же результат. Это поведение определяется таким стандартом, как IEEE 754.

Я бы просто придерживался решения, которое вы уже придумали и которое работает.

Также в качестве общего примечания вам не нужны такие функции, как:

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

Просто import numpy as np, а затем используйте np.isnan() в функции numba. Numba распознает функцию numpy и заменит ее правильной формой.

person JoshAdel    schedule 24.10.2017