2013-03-20 49 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',如果我们讨论很长的列表,这可能会更有效率。