7

N 個のパラメーターを持つ関数の値を含む N 次元の行列があります。各パラメーターには、個別の数の値があります。1 つを除くすべてのパラメーターで関数を最大化する必要があるため、最大化されていないパラメーターの値の数に等しいサイズの 1 次元ベクトルが得られます。また、他のパラメーターによって取得される値を保存する必要があります。

そのために、さまざまな軸に繰り返し適用numpy.maxして、行列の次元を減らして必要なものを見つけたいと考えました。最終的なベクトルは、省略したパラメーターのみに依存します。

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

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

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

これは戻ります

[[1 1]
 [1 1]]

これは、argmax が元の行列内の要素 (2,1,4,7) を選択していることを意味します。しかし、それらのインデックスを取得する方法は? 私は、 numpy から index までの一連の関数を matrix のインデックスとして直接unravel_index使用して試しましたが、成功しませんでした。argsx

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

4

1 に答える 1

10

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 スレッドで説明されています。この一般的なアイデアは、多次元配列で numpy.argmax() を使用することから得ました

于 2013-11-21T20:55:24.853 に答える