2010-12-19 5 views
15

में numpy/scipy का उपयोग करके सरणी में अनइंघॉल करें- मेरे पास एनपीएएम सरणी है जो मैं लॉग इन करने से पहले ऋणात्मक प्रविष्टियों को लॉग इन करना चाहता हूं और उनको अनदेखा कर दूंगा। जब मैं नकारात्मक प्रविष्टियों का लॉग लेता हूं, तो यह वापस आता है - अगर, तो परिणामस्वरूप कुछ -Inf मानों के साथ मैट्रिक्स होगा। मैं फिर इस मैट्रिक्स के कॉलम पर योग करना चाहता हूं, लेकिन -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

+3

@ user248237 - 'numpy.ma.log', आदि, फ़ंक्शंस स्वचालित रूप से एक मुखौटा सरणी बनायेगा जहां कुछ भी 'inf' या' nan' में परिणाम होता है। यह थोड़ा सा स्पष्ट है, हालांकि, आप इसके बजाय ऐसा कर सकते हैं: 'a = np.ma.masked_where (a == np.inf, a) ', और फिर बस' b = np.log (ए)' (या कोई अन्य समारोह)। वैकल्पिक रूप से, आप मुखौटा सरणी से बच सकते हैं और बस 'np.log (a [a! = Np.inf])। Sum() '(आप बूलियन सरणी द्वारा अनुक्रमित कर सकते हैं, यह' फ़िल्टर'-आधारित 'से अधिक स्वच्छ और तेज़ है उत्तर।) –

+0

@ user248237 मैंने मुखौटा सरणी को स्पष्ट रूप से प्रारंभ नहीं किया था। 'ए' सिर्फ एक सामान्य, गैर-मुखौटा सरणी है। 'ma.log' सभी मानों को मुखौटा करता है जहां (असली) लॉगरिदम अनिर्धारित है। फिर परिणामस्वरूप मुखौटा सरणी 'बी' का मोटे तौर पर इलाज किया जाता है जैसे कि मुखौटा प्रविष्टियां वहां नहीं थीं। – Philipp

1

उपयोग एक filter():

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

क्या यह एक वेक्टरकृत ऑपरेशन माना जाता है? क्या कोई और अधिक प्रभावी तरीका है? मुझे अपने कोड में कई बार ऐसा करने की ज़रूरत है और वेक्टरकृत दृष्टिकोण चाहते थे – user248237dfsf

+0

क्या आप पूछ रहे हैं कि यह इटरेटर के साथ जगह में किया गया है या नहीं? नहीं, क्या एक और अधिक कुशल तरीका है? AFAIK, आपको सरणी के माध्यम से लूप करना होगा क्योंकि कोई फ़िल्टर फ़ंक्शन नहीं है जो एक इटरेटर लौटाता है, जब तक आप एक लिखते नहीं हैं। – marcog

+0

मुझे नहीं लगता कि फ़िल्टर कोड एनएक्सएम सरणी के लिए काम करता है .. ऐसा लगता है कि केवल 1xM वैक्टर के लिए काम करता है। – user248237dfsf

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