2014-09-17 4 views
1

그래서 NumPy의 선형 대수 루틴을 사용하여 몇 가지 기본적인 전산 양자 역학을 수행합니다. 나는이 증가하는 순서로 에너지를 정렬하려면, 내가 매트릭스, 해밀 토니안이, 그리고 지금의 고유 값과 고유 벡터 2 차원 배열과 함께 배열 정렬

import numpy as np 
from numpy import linalg as la 

hamiltonian = np.zeros((N, N)) # N is some constant I have defined 
# fill up hamiltonian here 
energies, states = la.eig(hamiltonian) 

을 원하는 말, 나는 그들과 함께 상태를 정렬 할 수 있습니다. 예를 들어, 내가하는 일 :

groundStateEnergy = min(energies) 
groundStateIndex = np.where(energies == groundStateEnergy) 
groundState = states[groundStateIndex, :] 

필자는 기저 상태 (가장 낮은 고유 값을 갖는 고유 벡터)를 올바르게 플롯합니다. 그러나, 나는 이런 식으로 뭔가하려고하면 : 같은 방법으로 음모를 꾸미고

energies, states = zip(*sorted(zip(energies, states))) 

또는

energies, states = zip(*sorted(zip(energies, states), key = lambda pair:pair[0]))) 

더 이상 내가 만 행함으로써, 에너지와 함께 상태를 정렬 할 수있는 방법을 올바른 state.So을 나타내는를 ? (즉, 상태의 각 행을 에너지의 값과 연관시키고, 행의 순서가 에너지 값의 정렬 된 순서와 일치하도록 행을 다시 배열하고자 함)

+0

당신은 아마 [numpy.argsort] (HTTP를 확인해야합니다. scipy.org/doc/numpy/reference/generated/numpy.argsort.html) – goncalopp

+0

'numpy.argsort (energies)'의 표시를 사용하여'states' 배열을 정렬합니다. –

+0

그래서 numpy.argsort (에너지)에서 인덱스를 얻은 후에는 어떻게 그것들을 사용하는 상태의 행만 재정렬 할 수 있습니까? –

답변

2

argsort을 사용할 수 있습니다 다음과 같이 : // 문서 : 코멘트에 의해 처음 collumn이야에 의해 우리는 2 차원 배열을 정렬하는 예를 제안

>>> x = np.random.random((1,10)) 

>>> x 
array([ 0.69719108, 0.75828237, 0.79944838, 0.68245968, 0.36232211, 
     0.46565445, 0.76552493, 0.94967472, 0.43531813, 0.22913607]) 
>>> y = np.random.random((10)) 
>>> y 
array([ 0.64332275, 0.34984653, 0.55240204, 0.31019789, 0.96354724, 
    0.76723872, 0.25721343, 0.51629662, 0.13096252, 0.86220311]) 
>>> idx = np.argsort(x) 
>>> idx 
array([9, 4, 8, 5, 3, 0, 1, 6, 2, 7]) 
>>> xsorted= x[idx] 
>>> xsorted 
array([ 0.22913607, 0.36232211, 0.43531813, 0.46565445, 0.68245968, 
     0.69719108, 0.75828237, 0.76552493, 0.79944838, 0.94967472]) 
>>> ysordedbyx = y[idx] 
>>> ysordedbyx 
array([ 0.86220311, 0.96354724, 0.13096252, 0.76723872, 0.31019789, 
     0.64332275, 0.34984653, 0.25721343, 0.55240204, 0.51629662]) 

>>> x=np.random.random((10,2)) 
>>> x 
array([[ 0.72789275, 0.29404982], 
     [ 0.05149693, 0.24411234], 
     [ 0.34863983, 0.58950756], 
     [ 0.81916424, 0.32032827], 
     [ 0.52958012, 0.00417253], 
     [ 0.41587698, 0.32733306], 
     [ 0.79918377, 0.18465189], 
     [ 0.678948 , 0.55039723], 
     [ 0.8287709 , 0.54735691], 
     [ 0.74044999, 0.70688683]]) 
>>> idx = np.argsort(x[:,0]) 
>>> idx 
array([1, 2, 5, 4, 7, 0, 9, 6, 3, 8]) 
>>> xsorted = x[idx,:] 
>>> xsorted 
array([[ 0.05149693, 0.24411234], 
     [ 0.34863983, 0.58950756], 
     [ 0.41587698, 0.32733306], 
     [ 0.52958012, 0.00417253], 
     [ 0.678948 , 0.55039723], 
     [ 0.72789275, 0.29404982], 
     [ 0.74044999, 0.70688683], 
     [ 0.79918377, 0.18465189], 
     [ 0.81916424, 0.32032827], 
     [ 0.8287709 , 0.54735691]]) 
+1

배열을 정렬하는 색인을 가지고 있으면 멋진 색인보다 더 빠른 것으로 보이는'np.take()'를 사용하십시오 ... –

+0

대답은 정확하지만 OP의 예에서'y'는 2-d입니다. 2-d 배열에'idx'를 사용하는 예제를 보여주는 것이 더 나을 것입니다. –

+1

@SaulloCastro'take '를 사용하는 것이 여전히 더 빠를 수 있지만 numpy 1.9에서는 멋진 색인 생성의 성능이 훨씬 향상되어 더 이상 쓸모가 없을 수도 있습니다. 더 오래된 버전으로, 예, 절대적으로, 어디서나 2 배에서 10 배 빠르게, 그만한 가치가 있습니다. – Jaime