2013-04-24 9 views
26

मैं इस पंक्ति में सभी मानों के योग द्वारा एक numpy सरणी पंक्ति कैसे विभाजित कर सकता हूं?पंक्ति राशि द्वारा numpy विभाजित पंक्ति

यह एक उदाहरण है। लेकिन मैं बहुत यकीन है कि वहाँ ऐसा करने का एक फैंसी और भी बहुत कुछ कारगर तरीका है कर रहा हूँ:

import numpy as np 
e = np.array([[0., 1.],[2., 4.],[1., 5.]]) 
for row in xrange(e.shape[0]): 
    e[row] /= np.sum(e[row]) 

परिणाम:

array([[ 0.  , 1.  ], 
     [ 0.33333333, 0.66666667], 
     [ 0.16666667, 0.83333333]]) 

उत्तर

53

विधि # 1: None (या np.newaxis) एक अतिरिक्त आयाम जोड़ने के लिए उपयोग ताकि प्रसारण व्यवहार करेंगे:

>>> e 
array([[ 0., 1.], 
     [ 2., 4.], 
     [ 1., 5.]]) 
>>> e/e.sum(axis=1)[:,None] 
array([[ 0.  , 1.  ], 
     [ 0.33333333, 0.66666667], 
     [ 0.16666667, 0.83333333]]) 

विधि # 2: जाना स्थानांतरित खुश:

>>> (e.T/e.sum(axis=1)).T 
array([[ 0.  , 1.  ], 
     [ 0.33333333, 0.66666667], 
     [ 0.16666667, 0.83333333]]) 

(आप, संक्षिप्तता के लिए axis= हिस्सा ड्रॉप कर सकते हैं अगर आप चाहते हैं।)

विधि # 3: (जैमे की टिप्पणी से पदोन्नत)

उपयोग sum पर keepdims तर्क आयाम बनाए रखने के लिए:

>>> e/e.sum(axis=1, keepdims=True) 
array([[ 0.  , 1.  ], 
     [ 0.33333333, 0.66666667], 
     [ 0.16666667, 0.83333333]]) 
+0

मैं नहीं दिख रहा है आप कैसे छोड़ सकते हैं 'अक्ष = 1'। 'अक्ष 'तर्क के बिना,' sum() 'सरणी में सभी मानों का योग देता है। –

+18

numpy 1.7 में एक 'keepdims' तर्क है जो आपको 'e/e.sum (अक्ष = 1, keepdims = True)' – Jaime

+2

@WarrenWeckesser करने देता है: मैंने यह नहीं कहा कि आप '1' भाग को छोड़ सकते हैं, I ने कहा कि आप 'अक्ष =' भाग छोड़ सकते हैं। – DSM

5

आप इसे enter image description here के रूप में गणितीय रूप से कर सकते हैं।

यहां, E आपका मूल मैट्रिक्स है और D एक विकर्ण मैट्रिक्स है जहां प्रत्येक प्रविष्टि E में इसी पंक्ति का योग है। यदि आप भाग्यशाली हैं कि एक उलटा D है, तो यह चीजों को करने के लिए एक बहुत ही गणितीय रूप से सुविधाजनक तरीका है।

numpy में:

import numpy as np 

diagonal_entries = [sum(e[row]) for row in range(e.shape[0])] 
D = np.diag(diagonal_entries) 
D_inv = np.linalg.inv(D) 
e = np.dot(e, D_inv) 
संबंधित मुद्दे