2013-11-21 7 views
5

私はN個のパラメータを持つ関数の値を含むN次元行列を持っています。各パラメータには、個別の値が設定されています。私は、1つ以外のすべてのパラメータに対して関数を最大化する必要があり、その結果、最大化されていないパラメータの値の数に等しいサイズの1次元ベクトルが生成されます。私はまた、どの値が他のパラメータによって取られるかを保存する必要があります。軸上のnumpy.argmax要素のインデックスを取得します

これを行うには、numpy.maxを異なる軸に繰り返し適用して、必要なものを見つけるために行列の次元数を減らしたかったのです。最終的なベクトルは、私が残したパラメータだけに依存します。

しかし、最終要素の元のインデックス(他のパラメータによって取得された値に関する情報が含まれています)を見つけるのに問題があります。私はnumpy.maxと同じ方法でnumpy.argmaxを使用していますが、元のインデックスを取得することはできません。

私がしようとしているものの例は次のとおりです。

x = [[[1,2],[0,1]],[[3,4],[6,7]]] 
args = np.argmax(x, 0) 

これはARGMAXは、元内の要素(2,1,4,7)を選択していることを意味

[[1 1] 
[1 1]] 

を返します。マトリックス。しかし、どのようにインデックスを取得する?私はunravel_indexを試しましたが、argsを直接インデックスとして使用しました。x、numpyからindexへの一連の関数は成功しませんでした。

numpy.whereを使用すると、入力行列の内部に等しい値がある可能性があるので、解決策ではありません。異なる元の値から識別することはできません。

答えて

6

x.argmax(0)は、最大値のための第1軸に沿ったインデックスを与える。他の軸のインデックスを生成するには、np.indicesを使用します。

x = np.array([[[1,2],[0,1]],[[3,4],[6,7]]]) 
x.argmax(0) 
    array([[1, 1], 
      [1, 1]]) 
a1, a2 = np.indices((2,2)) 
(x.argmax(0),a1,a2) 
    (array([[1, 1], 
      [1, 1]]), 
    array([[0, 0], 
      [1, 1]]), 
    array([[0, 1], 
      [0, 1]])) 


x[x.argmax(0),a1,a2] 
    array([[3, 4], 
      [6, 7]]) 

x[a1,x.argmax(1),a2] 
    array([[1, 2], 
      [6, 7]]) 

x[a1,a2,x.argmax(2)] 
    array([[2, 1], 
      [4, 7]]) 

xは他の寸法を有する、a1を生成し、そして適切a2場合。

argmaxの使用方法についての公式文書はありませんが、それ以前のSOスレッドではこれについて説明しています。この一般的な考えはUsing numpy.argmax() on multidimensional arrays

です
関連する問題