2013-03-31 2 views
4

이것은 매우 간단한 문제인 것처럼 보이지만 저는 Python을 처음 사용하기 때문에 문제를 해결하기 위해 고심하고 있습니다. 2 개의 열세 번째 배열 (약 25,000 개의 정보 조각)에서 생성 된 분산 형 플롯/히트 맵이 있습니다. y 축은 배열에서 직접 가져오고 x 축은 두 배열에 대한 간단한 빼기 연산에서 생성됩니다.Numpy Array Matplotlib의 다각형을 사용하여 조각 내기

지금해야 할 일은 플롯의 특정 매개 변수 내에있는 선택 항목으로 작업 할 수 있도록 데이터를 분할하는 것입니다. (아래 색인 idx_c, idx_hidx를 참조하십시오) 나는 간단한 불평등을 사용하여 사각형을 잘라 수있어 enter image description here

하지만 난 정말이 필요합니다 예를 들어, 내가 평행 사변형에 속하는 모든 점을 추출해야 보다 복잡한 형상을 사용하여 점을 선택하는 방법. 다각형의 정점을 지정하여이 조각을 수행 할 수있는 것처럼 보입니다. 이것은 내가 해결책을 찾을 수있는 가장 가까운에 관한 것입니다,하지만 난 그것을 구현하는 방법을 알아낼 수 없습니다 :

http://matplotlib.org/api/nxutils_api.html#matplotlib.nxutils.points_inside_poly

적으로는, 내가 정말 아래의 색인, colorjh[idx] 같은 즉, 뭔가에 가깝다 뭔가를해야합니다. 궁극적으로 다른 수량 (예 : colorjh[idx] vs colorhk[idx])을 플롯해야하므로 인덱싱을 데이터 집합의 많은 배열 (배열이 많이 있음)로 전달할 수 있어야합니다. 어쩌면 당연 하겠지만 유연하지 않을 수도있는 솔루션이 있다고 생각합니다. 즉,이 플롯을 사용하여 관심있는 점을 선택한 다음 동일한 표에서 다른 배열에 대해 작업 할 색인이 필요할 것입니다. 내가 말처럼

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

twomass = atpy.Table() 

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

hmag = list([twomass['h_m']]) 
jmag = list([twomass['j_m']]) 
kmag = list([twomass['k_m']]) 

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

colorjh = np.array(jmag - hmag) 
colorhk = np.array(hmag - kmag) 

idx_c = (colorjh > -1.01) & (colorjh < 6) #manipulate x-axis slicing here here 
idx_h = (hmag > 0) & (hmag < 17.01)  #manipulate y-axis slicing here 
idx = idx_c & idx_h 

# heatmap below 
heatmap, xedges, yedges = np.histogram2d(hmag[idx], colorjh[idx], bins=200) 
extent = [yedges[0], yedges[-1], xedges[-1], xedges[0]] 
plt.clf() 
plt.imshow(heatmap, extent=extent, aspect=0.65) 

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

plt.gca().invert_yaxis()  #I put this in to recover familiar axis orientation 

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

plt.show() 

, 내가 파이썬에 새로운, 그래서 덜 전문 용어-y는 가능성이 설명은 내가 그것을 구현 할 수 있습니다 : 여기

내가 함께 일하고 있어요 코드입니다 . 다들 도움을 주셔서 감사합니다.

+0

귀하의 질문에,하지만 라인에 대답하지 않는다 : '잡지 = 목록을 ([['m '] twomass]); 'mag = np.array (mag)'는 중간에'list'없이'mag = np.array ([twomass [ 'm']])'조합 될 수 있습니다. 또한,'jmag-hmag'는 이미 배열이 될 것이므로'np.array (jmag-hmag)'를 부를 필요가 없습니다. – askewchan

+0

을 부수적으로 살펴보면, 배열에 대한 걱정이 있다면'np.asarray'가 좋습니다. – tacaswell

답변

2
a = np.random.randint(0,10,(100,100)) 

x = np.linspace(-1,5.5,100) # tried to mimic your data boundaries 
y = np.linspace(8,16,100) 
xx, yy = np.meshgrid(x,y) 

m = np.all([yy > xx**2, yy < 10* xx, xx < 4, yy > 9], axis = 0) 

enter image description here

+0

입력 해 주셔서 감사합니다. meshgrid 및 np.logical_and 행에 대해 설명 할 수 있습니까? 그것은 우아한 솔루션처럼 보이지만 이것을 코드로 어떻게 처리 할 수 ​​있는지는 알 수 없습니다. 빠른 시도를 통해 ValueError가 생성되었습니다. "새 배열의 전체 크기는 변경되지 않아야합니다." 내가 작업하고있는 배열은 모두 단일 값입니다 ... 행렬이 아닙니다. 그게 말이된다면. – Teachey

+0

내'x'와'y' 벡터 대신'h'와'h-j' 배열을 사용하십시오. 'h'의 조각은 여러분이보고있는'hj'의 어떤 값에 의존하기 때문에 직사각형이 아니기 때문에 각각의'h' 벡터에 대해 하나의 인덱스 만 가질 수는 없습니다. 그래서 여러분은 2 차원 행렬을 만들어야합니다. 모든. – askewchan