2013-03-20 2 views
4

나는 혼자 해결책을 찾기 위해 최선을 다했지만 관련성이있는 것은 아닙니다. 나는 .tbl 파일 (그것은 atpy로 추출하고있는 천문학적 인 테이블 형식)에서 추출한 몇 가지 질의없는 배열을 가지고있다. 각 배열에는 약 25,000 개의 숫자가 있으며, matplotlib를 사용하여 산점도로 그려 봅니다. y 축 값은 배열에서 바로 나오며, x 축은 두 개의 개별 배열에서 값을 간단하게 뺍니다.부등식을 사용하여 수치적인 배열을 분할하는 방법은 무엇입니까?

모두 괜찮습니다.하지만 실제로해야 할 일은 특정 범위에 해당하는 값을 추출하는 것입니다 (예를 들어, 10과 13 사이의 y 값과 0과 1). 줄거리가 작동하려면 물론이 값들이 서로 일치해야합니다.

import numpy as np 
from numpy import ndarray 
import matplotlib.pyplot as plt 
import matplotlib 
import atpy 

twomass = atpy.Table() 

twomass.read('/Raw_Data/IRSA_downloads/2MASS_GCbox1.tbl') 

hmag = list([twomass['h_m']]) 

jmag = list([twomass['j_m']]) 

colorjh = list([j-h for j,h in zip(jmag, hmag)]) 

x = [] 

y = [] 

def list_maker(): 
for c,h in zip(colorjh, hmag): 
    if np.all(c) < 1 == True and np.all(c) > 0 == True and np.all(h) < 13 == True and np.all(h) > 10 == True: 
     x.append(c) 
     y.append(h)  

list_maker() 

plt.scatter(x, y, c='g', s=1, alpha=0.05) 

plt.xlabel('Color(J-H)', fontsize=15)   #adjust axis labels here 
plt.ylabel('Magnitude (H)', fontsize=15) 

plt.gca().invert_yaxis() 

plt.legend(loc=2) 
plt.title('CMD for Galactic Center (2MASS)', fontsize=20) 
plt.grid(True) 

plt.show() 

내가 또한 데이터를 공격 태도를 보여준이 방법을 시도했지만 운이 : 저는 여기에있어 무엇 없습니다

colorjh = colorjh[colorjh<1] 

colorjh = colorjh[colorjh>0] 

내가 설정하는 노력을 포함하여, 다른 것들을 많이 시도했습니다 이러한 배열을 목록에 넣고, 불평등을 형식화하면서 많은 다른 것들을 만듭니다. 이 과정에서 필자는 대답에서 멀어 질 수도 있지만이 코드는 적어도 전체 분산을 인쇄합니다 (원하는대로 데이터를 잘라 내지 못합니다). 일부 반복 작업은 내가 원하는 번호 범위 근처에 아무 것도 인쇄하지 않은 빈 플롯을 가지고 있습니다.

저는 파이썬에 초보자입니다.이 사이트는 당신이 할 수있는 한 최대한 알려 주시기 바랍니다. 슈퍼 가르몬시라면 제안을 잘 활용하지 못할 수도 있습니다. 모두에게 감사드립니다.

답변

7

다음을 시도해보십시오. 귀하의 forzip과 동일하지만 훨씬 빨라야한다고 생각합니다. 뭔가 이해가되지 않는 경우, 코멘트에 물어 나는 편집합니다 :

hmag = np.array(hmag) 
jmag = np.array(jmah) 

colorjh = jmag - hmag 
idx_c = (colorjh > 0) & (colorjh < 1) # where condition on c is met 
idx_h = (hmag > 10) & (hmag < 13) # where condition on h is met 
idx = idx_c & idx_h # where both conditions are met 

plt.scatter(colorjh[idx], hmag[idx], c='g', s=1, alpha=0.05) 
+0

그게 다야! 와우, 고마워. 큰 도움. – Teachey

2

두 조건이 모두 한 번에 수행 할 수 있습니다 .nonzero()[0]는 것이 아니라, 그것을 인덱스의 목록을 만드는

hmag = np.array(hmag) 
jmag = np.array(jmah) 
colorjh = jmag - hmag 

idx = ((colorjh > 0) & (colorjh < 1) & (hmag > 10) & (hmag < 13)).nonzero()[0] 

plt.scatter(colorjh[idx], hmag[idx], c='g', s=1, alpha=0.05) 

그건 True와 False 값을 가진 '마스크'는 매우 긴 목록에 대해 말하면 더 효율적일 수 있습니다.