Игнорирование значений -Inf в массивах с использованием numpy / scipy в Python - PullRequest
16 голосов
/ 20 декабря 2010

У меня есть массив NxM в numpy, который я хотел бы взять в журнал, и игнорировать записи, которые были отрицательными, прежде чем принимать журнал.Когда я беру журнал отрицательных записей, он возвращает -Inf, так что в результате у меня будет матрица с некоторыми значениями -Inf.Затем я хочу суммировать по столбцам этой матрицы, но игнорируя значения -Inf - как я могу это сделать?

Например,

mylogarray = log(myarray)
# take sum, but ignore -Inf?
sum(mylogarray, 0)

Я знаю, что есть nansum, и янужен эквивалент, что-то вроде infsum.

Спасибо.

Ответы [ 5 ]

22 голосов
/ 24 декабря 2010

Самый простой способ сделать это - использовать numpy.ma.masked_invalid():

a = numpy.log(numpy.arange(15))
a.sum()
# -inf
numpy.ma.masked_invalid(a).sum()
# 25.19122118273868
12 голосов
/ 20 декабря 2010

Использовать массивы в масках :

>>> 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
1 голос
/ 05 октября 2018

Альтернатива использованию замаскированных массивов ....

import numpy as np
myarray = np.array([2, 0, 1.5, -3])
mylogarray = np.log(myarray) # The log of negative numbers is nan, 0 is -inf
summed = mylogarray[np.isfinite(mylogarray)].sum() # isfinite will exclude inf and nan
print(f'Sum of logged array is: {summed}')
>>> Sum of logged array is: 1.0986122886681096
1 голос
/ 20 декабря 2010

возможно, вы можете проиндексировать вашу матрицу и использовать:

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,:]));
1 голос
/ 20 декабря 2010

Используйте filter():

>>> array
array([  1.,   2.,   3., -Inf])
>>> sum(filter(lambda x: x != float('-inf'), array))
6.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...