具体来说,这些值来自.fits文件,我使用的是astropy。
本质上,我获得了大量数据,其中的对象每个都包含多个具有分类的列,相应的行包含字符串或整数以标识它们。例如,数组中的一个对象可以是
CLASS == GALAXY
SPECPRIMARY = 1
PROGNAME == MAIN
ZWARNING == 0
PRIMTARGET == 128
SUBCLASS = STRINGHERE
FIBERID == INTEGERHERE
etc...
但是,每个对象都有许多列和可能的标识符。所以,我试图使用np.where来只获取一个包含带有这些可能标识符的数组的数组
fits_data['CLASS'] == "GALAXY",
fits_data['SPECPRIMARY']==1,
fits_data['PROGNAME']=='main',
fits_data['ZWARNING']==0,
fits_data['PRIMTARGET']==64 OR 128 OR 256
所以,我猜它看起来像
allitems = np.where(fits_data['CLASS'] == "GALAXY",
fits_data['SPECPRIMARY']==1,
fits_data['PROGNAME']=='main',
fits_data['ZWARNING']==0,
fits_data['PRIMTARGET']==(64 || 128 || 256))
但我知道这不正确;我需要CLASS,SPECPRIMARY,PROGNAME和ZWARNING都有这些确切的值,而PRIMTARGET可以是64,128或256.
有人能把我推向正确的方向吗?感谢
答案 0 :(得分:0)
使用logical_and
和logical_or
以及逻辑索引可能是最好的方法:
is_primtarget = reduce(np.logical_or, [fits_data['PRIMTARGET'] == 64,
fits_data['PRIMTARGET'] == 128,
fits_data['PRIMTARGET'] == 256])
combined = reduce(np.logical_and, [is_primtarget,
fits_data['CLASS'] == "GALAXY",
...])
# pick only those elements matching your requirements
selection = all[combined]
我非常喜欢python的内置reduce
函数,它将给定的函数成对地应用于iterable中的所有输入。因此,您获得所有输入的logical_or
或logical_and
组合。