2013-04-24 28 views
26

Sayısal dizi satırını bu satırdaki tüm değerlerin toplamına bölebilir miyim?Satır sırasına göre numpy divide satırı

Bu bir örnektir. Ama bunu yapmanın bir fantezi ve çok daha verimli bir yolu yoktur eminim:

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]) 

Sonuç:

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

cevap

53

Yöntem # 1: None (veya np.newaxis) ekstra bir boyut eklemek için kullanın böylece yayın davranacaktır:

>>> 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]]) 

Yöntem # 2: go devrik-happy:

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

(İstersen, özlü olmak kaygısıyla axis= bölümünü bırakabilirsiniz.)

Yöntem # 3:

:

Kullanım sum üzerinde keepdims argüman boyut korumak için (Jaime'nın açıklama terfi)

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

Sana 'eksen = 1' damla nasıl görmüyorum. 'Axis' argümanı olmadan,' sum() 'dizideki tüm değerlerin toplamını döndürür. –

+18

Nümis 1.7'de 'e/e.sum (axis = 1, keepdims = True) yapmanıza izin veren bir' keepdims' argümanı var ' – Jaime

+2

@WarrenWeckesser:' 1 'parçasını bırakabileceğinizi söylemedim, 'axis = 'kısmını bırakabileceğinizi söyledi. – DSM

5

Matematiksel olarak enter image description here olarak yapabilirsiniz.

Burada, E orijinal matrisinizdir ve D, her girişin E numaralı satırda karşılık gelen satırın toplamı olduğu çapraz bir matristir. Bir tersi D sahip olmak için yeterince şanslıysanız, bu şeyler yapmak için oldukça matematiksel olarak uygun bir yoldur. Numpy olarak

:

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) 
İlgili konular