2016-07-23 8 views
6

私はサイズN * Mの行列を持ち、各行の平均値を求めたいと思います。値は1〜5であり、値を持たないエントリは0に設定されます。ただし、次のメソッドを使用して平均値を求めたい場合は、値が00以外の値のナンシー平均

matrix_row_mean= matrix.mean(axis=1) 

ゼロ以外の値の平均を得るにはどうすればよいですか?

答えて

10

各行の非ゼロの数を取得し、各行に沿った合計を平均化するために使用します。

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

サンプル - あなたがnumpyのの古いバージョンである場合は、あなたがそうのように、np.true_divideを置き換えるために、カウントのフロート変換を使用することができます

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

- したがって、実装は次のようになります実行 -

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

をこの問題を解決するための別の方法を置き換えることであろうそうようなものNaNs効果にzeros元のもの、無視しNaNs、次いでnp.nanmeanを使用してゼロ、 - パフォーマンスの観点から

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

は、私が最初のアプローチをお勧めします。

+0

npには属性がありませんtrue_divide – HimanAB

+0

@HimanUCC編集内容を確認してください。 – Divakar

+0

マスクされた配列のアプローチはコンパクトですが、必ずしも高速である必要はありません: 'np.ma.masked_equal(matrix、0).mean(axis = 1)' – hpaulj