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

16 python numpy scipy

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

例如,

mylogarray = log(myarray)
# take sum, but ignore -Inf?
sum(mylogarray, 0)
Run Code Online (Sandbox Code Playgroud)

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

谢谢.

Sve*_*ach 23

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

a = numpy.log(numpy.arange(15))
a.sum()
# -inf
numpy.ma.masked_invalid(a).sum()
# 25.19122118273868
Run Code Online (Sandbox Code Playgroud)


Phi*_*ipp 12

使用蒙面数组:

>>> 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
Run Code Online (Sandbox Code Playgroud)

  • @ user248237 - `numpy.ma.log`等函数会自动创建一个蒙版数组,其中任何导致`inf`或`nan`的内容都被屏蔽掉.但是,这有点不那么明确,所以你可以这样做:`a = np.ma.masked_where(a == np.inf,a)`,然后只做`b = np.log(a)` (或任何其他功能).或者,您可以避免使用屏蔽数组,只需执行`np.log(a [a!= np.inf]).sum()`(您可以通过布尔数组进行索引,它比基于`filter`的更清晰,更快速的回答.) (3认同)

Dou*_*ugR 5

使用掩码数组的替代方法....

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
Run Code Online (Sandbox Code Playgroud)