2016-04-19 12 views
1

私はこの3×3行列を有する:マスク最小値

a=array([[ 1, 11, 5], 
    [ 3, 9, 9], 
    [ 5, 7, -3]]) 

Iは最小値を捨て、各列の平均値を算出するために各列の最小値をマスクする必要があります。一般的な解決策はありますか?

Iは、マスク
a_masked=np.ma.masked_where(a==np.ma.min(a,axis=1),a) 

第3行目の最小値ではなく、第二の行と試みましたか?

私は助けていただきありがとうございます。ありがとう!

答えて

1

比較a == a.min(axis=1)各行の最小値に対する各カラムを比較するのではなく最小値に各行を比較しているため、問題があります。これは、a.min(axis=1)Nx1配列と同様に動作する行列ではなく、ベクトルを返すためです。したがって、ブロードキャストの場合、==オペレータは、次元を一致させるために列単位で操作を実行します。この問題を解決するため

a == a.min(axis=1) 

# array([[ True, False, False], 
#  [False, False, False], 
#  [False, False, True]], dtype=bool) 

一つの潜在的な方法は、列ベクトル(例えば、3×1次元配列)にresizea.min(axis=1)の結果です。

a == np.resize(a.min(axis=1), [a.shape[0],1]) 

# array([[ True, False, False], 
#  [ True, False, False], 
#  [False, False, True]], dtype=bool) 

以上単に@ColonelBeuvelが示されているよう:

a == a.min(axis=1)[:,None] 

は今、コードのあなたの全体の行にこれを適用します。

a_masked = np.ma.masked_where(a == np.resize(a.min(axis=1),[a.shape[0],1]), a) 

# masked_array(data = 
# [[-- 11 5] 
# [-- 9 9] 
# [5 7 --]], 
#  mask = 
#   [[ True False False] 
#   [ True False False] 
#   [False False True]], 
#   fill_value = 999999) 
+0

説明をありがとう! @Colonel Beauvelのおかげで、今でも動作します –

+0

私は実際には別の質問があります。 a = array([[7、5、5]、 [3,6,9]、 [5,1,1]])同じ要素の2つまたは3つの行がある場合はどうなりますか? どのように最小値のいずれかをマスクするだけで、すべてをマスクすることはできませんか? –

+0

私もお手伝いできますか? @ColonelBeuvel –

0

min()関数とは何ですか?

すべての行についてmin(行)を実行すると、Case a行にこのリストの最小値が表示されます。この最小値をすべての最小値のリストに追加するだけです。

minList = []

for i in array: minList.append(min(i))

+0

いいえ、いいえ、いいえ。 Forループはそのような操作のために "禁止されています"。 –

+0

上記のコメント欄で他の回答にお手伝いできますか? @ColonelBeuvel –