在Python中使用numpy/scipy忽略数组中的-Infinity值

27 投票
5 回答
39866 浏览
提问于 2025-04-16 08:46

我有一个NxM的数组,使用numpy库,我想对这个数组进行对数运算,但要忽略那些在取对数之前就是负数的值。因为对负数取对数会得到负无穷大(-Inf),这样我的矩阵里就会出现一些-Inf的值。接下来,我想对这个矩阵的每一列进行求和,但要忽略这些-Inf的值,我该怎么做呢?

举个例子,

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

我知道有一个叫nansum的函数,我需要一个类似的函数,像是叫infsum的。

谢谢。

5 个回答

7

使用掩码数组的替代方案……

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
40

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

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

使用 掩码数组

>>> 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

撰写回答