在Python中使用numpy / scipy忽略-Inf值

时间:2010-12-19 23:37:38

标签: python numpy scipy

我有一个numpy中的NxM数组,我想记录日志,并忽略在记录之前为负的条目。当我记录负数条目的日志时,它会返回-Inf,因此我将得到一个带有一些-Inf值的矩阵作为结果。然后我想总结一下这个矩阵的列,但是忽略-Inf值 - 我该怎么做?

例如,

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

我知道有nansum,我需要等效的东西,比如infsum。

感谢。

5 个答案:

答案 0 :(得分:20)

最简单的方法是使用numpy.ma.masked_invalid()

a = numpy.log(numpy.arange(15))
a.sum()
# -inf
numpy.ma.masked_invalid(a).sum()
# 25.19122118273868

答案 1 :(得分:12)

使用masked arrays

>>> 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 :(得分:1)

使用filter()

>>> array
array([  1.,   2.,   3., -Inf])
>>> sum(filter(lambda x: x != float('-inf'), array))
6.0

答案 3 :(得分:1)

也许您可以索引矩阵并使用:

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,:]));

答案 4 :(得分:0)

替代使用掩码数组。...

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