2010-12-19 124 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