Python

2010-12-19 9 views
15

içinde numpy/scipy kullanarak dizilerde -Inf değerlerini yok sayma Ben günlüğü almak ve günlüğü almadan önce negatif olan girişleri yok saymak için bir NxM dizilim var. Negatif girdilerin günlüğünü aldığımda, -Inf döndürür, bu nedenle sonuç olarak bazı -Inf değerlerine sahip bir matrisim olur. Sonra bu matrisin sütunlarını toplamak istiyorum, ama -Inf değerlerini göz ardı etmek istiyorum - bunu nasıl yapabilirim? ÖrneğinPython

,

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

Ben nansum olduğunu biliyorum ve ben, infsum gibi bir şey eşdeğer gerekir.

Teşekkürler.

cevap

10

Kullanım 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

lütfen bunu genişletebilir misiniz? Ben örneği anlamıyorum. Yukarıdaki maskelenen diziyi nasıl başlattınız? – user248237dfsf

+3

@ user248237 - "numpy.ma.log" vb. Işlevler otomatik olarak "inf" veya "nan" ile sonuçlanan her şeyin maskelenmesi durumunda maskelenmiş bir dizi oluşturacaktır. Bunun yerine bunu yapabilirsiniz böylece bu olsa da, biraz daha az açıktır: 'a = np.ma.masked_where (a == np.inf a)' ve ardından sadece bunu 'b = np.log (a)' (veya başka bir işlev). Alternatif olarak, maskeli diziler önlemek ve sadece 'np.log (a [a! = Np.inf]) yapmak. Sum()' (Sen, bu 'filter' tabanlı çok daha temiz ve daha hızlı boole diziler tarafından endeks bulunuyor olabilir answer.) –

+0

@ user248237 Maskeli diziyi açıkça başlatmamıştım. 'a' sadece normal, maskelenmemiş bir dizidir. ma.log, (gerçek) logaritmanın tanımsız olduğu tüm değerleri maskeler. Daha sonra ortaya çıkan maskelenen dizi 'b', maskelenmiş girişler orada yokmuş gibi kabaca muamele edilir. – Philipp

1

kullanın filter():

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

Bu bir vektör işlem olarak kabul edilir mi? Daha verimli bir yolu var mı? Kodumda bunu defalarca yapmalı ve vectorized yaklaşımı istedim – user248237dfsf

+0

Bunun yineleyicilerle yerinde yapılıp yapılmadığını mı soruyorsunuz? Hayır. Daha verimli bir yolu var mı? AFAIK, siz bir tane yazmazsanız, bir yineleyici döndüren bir filtre işlevi olmadığı için dizinin içinden geçmeniz gerekir. – marcog

+0

Filtre kodunun NxM dizileri için çalıştığını sanmıyorum .. sadece 1xM vektörleri için çalışıyor gibi görünüyor. – user248237dfsf

1

belki endeksleyebilir matris ve kullanım:

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

Bunu yapmanın en kolay yolu kullanmaktır numpy.ma.masked_invalid():

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