2016-07-23 25 views
6

N * M boyutunda bir matrisi var ve her satır için ortalama değeri bulmak istiyorum. Değerler 1'den 5'e kadardır ve herhangi bir değeri olmayan girdiler 0'a ayarlanır. Ancak, aşağıdaki yöntemi kullanarak ortalama bulmak istediğimde, değeri de olan girdileri de saydığı için yanlış anlam verir. 0.Sıfır ortalama sıfır olmayan değerler

matrix_row_mean= matrix.mean(axis=1) 

Sadece sıfır olmayan değerlerin ortalamasını nasıl edinebilirim?

cevap

10

Her satırda sıfırlar sayısını alın ve her satırdaki toplamı almak için bunu kullanın. aynen böyle np.true_divide yerine sen numpy eski bir sürümü üzerinde iseniz, sayımı şamandıra dönüşümünü kullanabilirsiniz

np.true_divide(matrix.sum(1),(matrix!=0).sum(1)) 

- - Böylece, uygulama aşağıdaki gibi görünecektir

matrix.sum(1)/(matrix!=0).sum(1).astype(float) 

Numune çalıştırmak -

In [160]: matrix 
Out[160]: 
array([[0, 0, 1, 0, 2], 
     [1, 0, 0, 2, 0], 
     [0, 1, 1, 0, 0], 
     [0, 2, 2, 2, 2]]) 

In [161]: np.true_divide(matrix.sum(1),(matrix!=0).sum(1)) 
Out[161]: array([ 1.5, 1.5, 1. , 2. ]) 

başka yolu da sorun değiştirmek şeklinde olur çözmek için NaNs ile sıfır ve sonra şöyle bu NaNs ve etkisi bu orijinal zeros yılında, görmezden hangi, np.nanmean kullanmak -

np.nanmean(np.where(matrix!=0,matrix,np.nan),1) 

bakış performans açısından, ilk yaklaşım öneriyoruz.

+0

np hiçbir özelliğe sahip değil true_divide – HimanAB

+0

@HimanUCC Düzenlemeleri gözden geçirin. – Divakar

+0

Maskeli dizi yaklaşımı kompakttır (ancak daha hızlı değil): np.ma.masked_equal (matrix, 0) .mean (axis = 1) ' – hpaulj