Игнорирование значений -Inf в массивах с использованием numpy/scipy в Python
У меня есть массив NxM в numpy, который я бы хотел записать в журнал, и игнорировать записи, которые были отрицательными, до того, как он запустил журнал. Когда я беру журнал отрицательных записей, он возвращает -Inf, поэтому в результате у меня будет матрица с некоторыми значениями -Inf. Затем я хочу суммировать по столбцам этой матрицы, но игнорируя значения -Inf - как я могу это сделать?
Например,
mylogarray = log(myarray)
# take sum, but ignore -Inf?
sum(mylogarray, 0)
Я знаю там nansum, и мне нужен эквивалент, что-то вроде infsum.
Спасибо.
Ответы
Ответ 1
Используйте маскированные маски:
>>> a = numpy.array([2, 0, 1.5, -3])
>>> b = numpy.ma.log(a)
>>> b
masked_array(data = [0.69314718056 -- 0.405465108108 --],
mask = [False True False True],
fill_value = 1e+20)
>>> b.sum()
1.0986122886681096
Ответ 2
Самый простой способ сделать это - использовать numpy.ma.masked_invalid()
:
a = numpy.log(numpy.arange(15))
a.sum()
# -inf
numpy.ma.masked_invalid(a).sum()
# 25.19122118273868
Ответ 3
Используйте filter()
:
>>> array
array([ 1., 2., 3., -Inf])
>>> sum(filter(lambda x: x != float('-inf'), array))
6.0
Ответ 4
возможно, вы можете индексировать свою матрицу и использовать:
import numpy as np;
matrix = np.array([[1.,2.,3.,np.Inf],[4.,5.,6.,np.Inf],[7.,8.,9.,np.Inf]]);
print matrix[:,1];
print sum(filter(lambda x: x != np.Inf,matrix[:,1]));
print matrix[1,:];
print sum(filter(lambda x: x != np.Inf,matrix[1,:]));