如何用不等式切片numpy数组?

4 投票
2 回答
3960 浏览
提问于 2025-04-17 19:46

我尽力自己找解决办法,但就是没找到相关的信息。我有一些从.tbl文件中提取的numpy数组(这是一个天文表格格式,我是用atpy提取的)。每个数组里大约有25000个数字,我用matplotlib画散点图。y轴的值直接来自数组,x轴是两个不同数组值的简单相减。

这都没问题,但我真正需要做的是提取落在某个范围内的值(比如,我需要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,也刚来这个网站,所以请尽量详细地给我任何建议。如果用的术语太专业,我可能无法很好地理解你的建议。谢谢大家。

2 个回答

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] 会把结果变成一个索引列表,而不是一个包含真和假的“掩码”。如果我们处理的是非常长的列表,这样做可能会更有效率。

7

试试下面这个,我觉得它和你的 for 循环以及 zip 函数做的事情差不多,但应该会快很多。如果有什么不明白的地方,可以在评论里问我,我会进行修改:

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)

撰写回答