2015-01-09 4 views
1

numpy 배열을 정렬하고 정렬 배열 색인을 얻지 만 원본 배열 색인을 적용하면 예상 한 바를하지 않는 문제가 있습니다. 대신 돌아 가지의numpy : 색인 생성 관련 문제

import numpy as np 

# Two 3x3 matrices 
x = np.random.rand(2, 3, 3) 
# Perform some decomposition (Never mind the matrices are not hermitian...) 
evals, evecs = np.linalg.eigh(x) 

# evals has shape (2, 3), evecs has shape (2, 3, 3) 
indices = evals.argsort(axis=1)[..., ::-1] # Do descending sort 

# Now I want to apply the index to evals. 
evals = evals[:, indices] 

(2, 3) 배열, I는 (2, 3, 3) 다시 배열이 어디에 행이 점점 점점 오전 : 그래서, 여기에 내가 뭐하는 거지에 대한 테스트 케이스입니다 복제. 다음과 같음 :

array([[[ 1.15628047, 0.16853886, -0.28607138], 
     [ 1.15628047, 0.16853886, -0.28607138]], 

     [[ 2.4311532 , -0.00754817, -0.24086572], 
     [ 2.4311532 , -0.00754817, -0.24086572]]]) 

왜 그런지는 잘 모르겠습니다. 어떤 도움을 주시면 감사하겠습니다.

+0

'evals는 [:, 인덱스]''배열 배열의'index''th 열을 반환 할 간단합니다 ([1.2101455, 1.42952306])' 그래서 당신은 무엇을 기대합니까? – Kasramvd

+0

글쎄, 나는 색인에 따라 순열을 기대하고 있었다. 글쎄, 처음 엔 노력하지 않았던 evals [색인]을 시도했다. 결과는 다음과 같습니다. array ([[1.15628047, 0.16853886, -0.28607138], [[2.4311532, -0.00754817, -0.24086572]]) – Luca

+1

'(2,2,3) '. 첫 번째 2는'evals'의 1 번째 희미한 것이고'(2,3)'은'(2, 3) 배열로'evals'의 마지막 희미한 부분을 색인화 한 것입니다. – hpaulj

답변

1

이 작동합니다 :

import numpy as np 
idx0 = np.arange(evals.shape[0])[:,np.newaxis] 
idx1 = evals.argsort(1)[...,::-1] 
evals[idx0,idx1] 

이 순서를 감소시켜, 개별적으로, 각 행을 정렬합니다.

편집 : 이 경우 고유 벡터 evecs을 추가로 처리하려면 (idx0,idx1)이 필요합니다. 이 경우 아니었다면,

evals.sort() 
evals = evals[:,::-1] 
+0

감사합니다. 이 재 시술은 무엇입니까? 방금 ipython으로 실행하려고했는데 그걸로 바뀌 었습니다. 신경 쓰지 마세요 ... np.newaxis – Luca

+1

'[0,1, 2]''[[0], [1], [2]]와 같은 형태의 (2D) "열"배열로 변환합니다. – gg349

+0

이것은 일을 했어! 이 줄을 자세히 설명해 주시겠습니까? idx0 = np.arange (evals.shape [0]) [: np.newaxis] – Luca