2013-11-21 2 views
5

N 매개 변수가있는 함수의 값이 들어있는 N 차원 행렬이 있습니다. 각 매개 변수에는 개별 값 수가 있습니다. 모든 매개 변수가 아닌 하나의 매개 변수에 대해 함수를 최대화해야하므로 최대화되지 않은 매개 변수의 값 수와 동일한 크기의 1 차원 벡터가됩니다. 또한 다른 매개 변수에 의해 어떤 값이 사용되는지를 저장해야합니다.축에 대해 numpy.argmax 요소의 인덱스 가져 오기

이렇게하려면 필자는 다른 축을 기준으로 numpy.max을 반복 적용하여 원하는 부분을 찾기 위해 행렬의 차원을 줄였습니다. 마지막 벡터는 내가 버린 매개 변수에만 의존합니다.

하지만 최종 요소의 원래 색인 (다른 매개 변수에 의해 취해진 값에 대한 정보 포함)을 찾는 데 어려움이 있습니다. 나는 numpy.max과 같은 방식으로 numpy.argmax을 사용하고 있지만 원래 색인을 다시 얻을 수는 없습니다.

내가 노력하고있어의 예는 다음과 같습니다

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

이 원래 내의 요소 (2,1,4,7)를 argmax 선택하는 것을 의미

[[1 1] 
[1 1]] 

을 반환 매트릭스. 그러나 어떻게 그들의 지수를 얻는가? 나는 unravel_index을 시도했다. args을 매트릭스 x의 인덱스로 사용했다. numpy에서 인덱스로 성공하지 못한 함수들이있다.

입력 행렬이 내부에 동일한 값을 가질 수 있으므로 numpy.where을 사용하면 해결책이되지 않으므로 다른 원본 값을 식별 할 수 없습니다.

답변

6

x.argmax(0)은 최대 값에 대해 첫 번째 축을 따라 색인을 제공합니다. 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