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

在Python中使用numpy/scipy忽略数组中的-Inf值,python,numpy,scipy,Python,Numpy,Scipy,我有一个numpy中的NxM数组,我希望获取日志,并在获取日志之前忽略负的条目。当我获取负项的日志时,它返回-Inf,因此我将得到一个带有一些-Inf值的矩阵。然后我想对这个矩阵的列求和,但忽略-Inf值——我怎么做呢 比如说, mylogarray = log(myarray) # take sum, but ignore -Inf? sum(mylogarray, 0) 我知道有nansum,我需要类似的东西,比如infsum 谢谢。使用过滤器() 使用: 也许您可以为矩阵编制索引并使用:

我有一个numpy中的NxM数组,我希望获取日志,并在获取日志之前忽略负的条目。当我获取负项的日志时,它返回-Inf,因此我将得到一个带有一些-Inf值的矩阵。然后我想对这个矩阵的列求和,但忽略-Inf值——我怎么做呢

比如说,

mylogarray = log(myarray)
# take sum, but ignore -Inf?
sum(mylogarray, 0)
我知道有nansum,我需要类似的东西,比如infsum

谢谢。

使用
过滤器()

使用:


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

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

最简单的方法是使用:


使用屏蔽阵列的替代方案

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

这被认为是矢量化操作吗?有没有更有效的方法?我需要在我的代码中多次这样做,并且想要一种矢量化的方法。你是在问,这是不是用迭代器实现的?没有。有没有更有效的方法?好吧,你必须循环遍历数组,因为没有返回迭代器的过滤函数,除非你写一个。我认为过滤代码不适用于NxM数组。。它似乎只适用于1xM向量。在numpy数组上使用列表理解、过滤等“numpytonic”方法进行过滤(lambda x:x!=float('-inf')、数组)
比在列表上慢得多。正因为如此,numpy阵列有许多功能,可以避免显式循环并在每个元素上操作。您能详细介绍一下吗?我不明白这个例子。您是如何初始化上面的屏蔽数组的?@user248237-the
numpy.ma.log
等函数将自动创建一个屏蔽数组,其中任何导致
inf
nan
的内容都将被屏蔽。不过,这不太明确,所以您可以这样做:
a=np.ma.masked_其中(a==np.inf,a)
,然后只执行
b=np.log(a)
(或任何其他函数)。或者,您可以避免屏蔽数组,只需执行
np.log(a[a!=np.inf]).sum()
(您可以通过布尔数组进行索引,它比基于
过滤器的答案更干净、更快。)@user248237我没有显式初始化屏蔽数组
a
只是一个普通的非屏蔽数组
ma.log
屏蔽未定义(实)对数的所有值。然后,生成的屏蔽数组
b
被粗略地视为屏蔽项不存在。我得到了
AttributeError:“SingleBlockManager”对象没有属性“log”
工作正常!感谢如果即使使用掩码,您仍然有求和结果
inf
,请尝试将
dtype
更改为
np.float64
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,:]));
a = numpy.log(numpy.arange(15))
a.sum()
# -inf
numpy.ma.masked_invalid(a).sum()
# 25.19122118273868
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