2012-06-28 6 views
5

argsort() 함수는 결과가 sort() 결과와 일치하도록 원래 배열의 색인을 생성하는 데 사용할 수있는 색인 행렬을 반환합니다.numpy : 배열에 argsort 적용

이러한 색인을 적용 할 수있는 방법이 있습니까? 나는 두 개의 배열을 가지고 있는데, 하나는 정렬 순서를 얻기 위해 사용 된 배열이고 다른 하나는 연관된 데이터이다.

나는 assoc_data[array1.argsort()]을 계산하고 싶습니다. 그러나 작동하지 않는 것 같습니다. 내가 (또는 다른 관련 데이터와 배열)하지만 난 그렇게 할 방법을 잘 모르겠어요들 z2에 적용하고 싶은

z=array([1,2,3,4,5,6,7]) 
z2=array([z,z*z-7]) 
i=z2.argsort() 

z2=array([[ 1, 2, 3, 4, 5, 6, 7], 
      [-6, -3, 2, 9, 18, 29, 42]]) 
i =array([[1, 1, 1, 0, 0, 0, 0], 
      [0, 0, 0, 1, 1, 1, 1]]) 

:

다음은 예입니다.

+0

정렬 할 축은 무엇입니까? – user545424

답변

7

이 아마도 과잉이다, 그러나 이것은 차의 경우에 작동합니다 : 당신은 그냥 numpyology 내 석사 학위를 가지고 운이 좋다

import numpy as np 
axis = 0 
index = list(np.ix_(*[np.arange(i) for i in z2.shape])) 
index[axis] = z2.argsort(axis) 
z2[index] 

# Or if you only need the 3d case you can use np.ogrid. 

axis = 0 
index = np.ogrid[:z2.shape[0], :z2.shape[1], :z2.shape[2]] 
index[axis] = z2.argsort(axis) 
z2[index] 
+4

이상하게도 나는 정확히 1 년 후 이것을 다시 필요로했고, 어떻게해야 하는지를 찾기 위해, 내가 전에 물었던 질문을 가로 질렀다. 나는 마침내 이것이 무엇을하는지 이해한다. 과잉, btw처럼 보이지 않는다. –

0

아하, 알아 냈어.

In [274]: z2[i,range(z2.shape[1])] 
Out[274]: 
array([[-6, -3, 2, 4, 5, 6, 7], 
     [ 1, 2, 3, 9, 18, 29, 42]]) 
+1

아아 -이 기능은 2D가 아닌 3D에서 작동합니다. 한숨. –

+0

플러스 당신은 내가 무엇인지 말하지 않았다;) – tiho

+0

음 .... 네, 나는 '내가 무엇을했는지 말했습니다. 질문을 읽으십시오. –

4

. 무슨 일이 일어나고 있는지에 대한 설명은

>>> def apply_argsort(a, axis=-1): 
...  i = list(np.ogrid[[slice(x) for x in a.shape]]) 
...  i[axis] = a.argsort(axis) 
...  return a[i] 
... 
>>> a = np.array([[1,2,3,4,5,6,7],[-6,-3,2,9,18,29,42]]) 
>>> apply_argsort(a,0) 
array([[-6, -3, 2, 4, 5, 6, 7], 
     [ 1, 2, 3, 9, 18, 29, 42]]) 

this question에 내 대답을 참조하십시오.

관련 문제