2016-03-22 62 views
4

の場合、n個のクラスのm個のサンプルの確率を示す2dのnumpyの配列を仮定します(確率はサンプルごとに1になります)。2dのnumpy配列を2進数の指標行列に変換して、最大値が

各サンプルが1つのカテゴリにしか含まれていないと仮定して、オリジナルと同じ形の新しい配列を作成したいが、どちらのクラスが最も高い確率を持つかを示すバイナリ値のみを使用する。

例:

[[0.2, 0.3, 0.5], [0.7, 0.1, 0.1]] 

がに変換する必要があります。

[[0, 0, 1], [1, 0, 0]] 

それはすでにAMAX私が欲しいほとんどないものを見えますが、上記のdescrivedとしてインデックスの代わりに、私はインジケータ行列をしたいです。

シンプルですが、どういうわけか標準のnumpy関数を使用して計算できません。もちろん、通常のPythonループを使うこともできますが、よりシンプルな方法が必要です。

複数のクラスが同じ確率を持つ場合は、クラスの1つのみを選択するソリューション(この場合は気にしません)が好きです。

ありがとうございます!

+0

いいえ、彼らがまったく同じ値を持つことになりそうです。私は1つのカテゴリを選択したいだけです、私は本当にこの場合はどちらにも気をつけません。 – aKzenT

+0

追加、ありがとう提案 – aKzenT

答えて

8

は、ここに1つの方法です:

In [112]: a 
Out[112]: 
array([[ 0.2, 0.3, 0.5], 
     [ 0.7, 0.1, 0.1]]) 

In [113]: a == a.max(axis=1, keepdims=True) 
Out[113]: 
array([[False, False, True], 
     [ True, False, False]], dtype=bool) 

In [114]: (a == a.max(axis=1, keepdims=True)).astype(int) 
Out[114]: 
array([[0, 0, 1], 
     [1, 0, 0]]) 

(しかし、これは行の最大の各発生の真の価値を与えるだけの最初の発生を選択するための良い方法のためDivakarの回答を参照してください。 。最大)

+0

私はこれがnumpyの配列のために働くとは思わないが...私は最大機能でkeepdimsパラメータを見なかった。 – aKzenT

+0

'a'はnumpyの配列です。どのバージョンのnumpyを使用していますか? –

+0

私はバージョン1.10.4を使用しています。 – aKzenT

4

一つだけを選択したいの絆(2つ以上の要素が行で最高の一つである)、の場合は、ここでnp.argmaxbroadcastingでそうする一つの方法だ -

サンプル実行 -

In [296]: A 
Out[296]: 
array([[ 0.2, 0.3, 0.5], 
     [ 0.5, 0.5, 0. ]]) 

In [297]: (A.argmax(1)[:,None] == np.arange(A.shape[1])).astype(int) 
Out[297]: 
array([[0, 0, 1], 
     [1, 0, 0]]) 
関連する問題