2010-12-19 137 views
15

我在numpy中有一个NxM数组,我想取日志,忽略在取得日志之前为负数的条目。当我记录负值条目时,它会返回-Inf,所以我将得到一个带有一些-Inf值的矩阵。然后我想总结这个矩阵的列,但忽略-Inf值 - 我该怎么做?忽略在Python中使用numpy/scipy的数组中的INF值

例如,

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

我知道有nansum,我需要相当于像infsum。

谢谢。

回答

10

使用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 
+1

你可以请扩展一下吗?我不明白这个例子。你是如何初始化上面的屏蔽数组的? – user248237dfsf 2010-12-20 00:35:42

+3

@ 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'答案) – 2010-12-20 03:19:47

+0

@ user248237我没有明确地初始化被屏蔽的数组。 'a'只是一个普通的非掩码数组。 'ma.log'掩盖(实数)对数未定义的所有值。然后,生成的掩码数组“b”被粗略对待,就好像掩码条目不存在一样。 – Philipp 2010-12-22 01:10:52

1

使用filter()

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

这是否被认为是矢量化操作?有没有更高效的方法?我需要在我的代码中多次执行此操作,并且想要一个向量化方法 – user248237dfsf 2010-12-19 23:47:34

+0

您是否问是否使用迭代器就地完成了这个操作?没有。有没有更高效的方法? AFAIK,你必须遍历数组,因为没有过滤器函数返回一个迭代器,除非你写一个。 – marcog 2010-12-19 23:55:44

+0

我不认为过滤器代码适用于NxM阵列..它似乎只适用于1xM向量。 – user248237dfsf 2010-12-20 00:33:57

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

要做到这一点,最简单的方法是使用numpy.ma.masked_invalid()

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