2013-03-20 82 views
4

我已經盡我所能,自己找到解決方案,但我只是沒有發現任何相關的東西。我有一些從.tbl文件中提取的numpy數組(這是我用atpy提取的一種天文表格格式)。每個數組中大約有25,000個數字,我將它們繪製爲matplotlib的散點圖。 y軸值直接來自陣列,x軸是兩個單獨陣列中值的簡單減法。如何切片不均勻的numpy數組?

這一切都很好,但我真正需要做的是提取落在特定範圍內的值(例如,我需要y值介於10和13之間,x值介於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] 

我已經嘗試了很多不同的東西,包括試圖把這些數組放入列表中,以及用不等式格式化的許多不同的東西。在這個過程中,我可能離自己的答案越來越遠,但是這段代碼至少會打印整個分散的數據(它不能像我想要的那樣分割數據)。一些其他的迭代已經在我要查找的數字範圍附近打印空白圖。

我是新來的python和這個網站,所以請儘可能明確,你可以用任何提示等。如果它是超級jargony我可能無法很好地使用你的建議。感謝大家。

回答

7

請嘗試以下操作,我認爲它與您的for s和zip s一樣,但應該快得多。如果事情沒有意義,要求在評論,我會編輯:

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 2013-03-20 17:06:21

2

兩個條件都可以一次完成:

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) 

.nonzero()[0]使得指數列表,而不是一個帶有True和False值的'mask',如果我們討論很長的列表,這可能會更有效率。