Numpy условные арифметические операции над двумя массивами - PullRequest
2 голосов
/ 16 марта 2011

Все еще пытаюсь заработать свои пустые полосы: я хочу выполнить арифметическую операцию над двумя пустыми массивами, что достаточно просто:

return 0.5 * np.sum(((array1 - array2) ** 2) / (array1 + array2))

Проблема в том, что мне нужно иметь возможность указать условие, что, если оба массива имеют поэлементный 0 для одного и того же элемента i, не выполнять операцию вообще - было бы здорово просто вернуть 0 на этом - чтобы не делить на 0.

Однако я понятия не имею, как задать это условие, не прибегая к страшному вложенному циклу for. Заранее благодарю за помощь.

Редактировать : Было бы также идеально не прибегать к псевдосчету + 1.

Ответы [ 3 ]

3 голосов
/ 16 марта 2011

Просто замените np.sum() на np.nansum():

return 0.5 * np.nansum(((array1 - array2) ** 2) / (array1 + array2))

np.nansum() трактует nan с как ноль.

3 голосов
/ 16 марта 2011
return numpy.select([array1 == array2, array1 != array2], [0.5 * np.sum(((array1 - array2) ** 2) / (array1 + array2)), 0])

должен сделать трюк ... numpy.where также может быть использовано.

0 голосов
/ 16 марта 2011

Вы также можете попробовать пост-приложение numpy.nan_to_num:

http://docs.scipy.org/doc/numpy/reference/generated/numpy.nan_to_num.html

хотя я обнаружил, что когда в вашем коде есть деление на ноль, оно выдает предупреждение, но заполняет этот элемент нулями (при выполнении целочисленных вычислений) и NaN при использовании чисел с плавающей запятой.

Если вы хотите пропустить сумму, когда у вас есть деление на ноль, вы также можете просто сделать расчет и затем проверить на NaN перед возвратом:

xx = np.sum(((array1 - array2) ** 2) / (array1 + array2))
if np.isnan(xx):
    return 0
else:
    return xx 

Редактировать: Чтобы заставить замолчать предупреждения, вы можете попытаться возиться с numpy.seterr:

http://docs.scipy.org/doc/numpy/reference/generated/numpy.seterr.html

...