使用NumPy从基于给定条件的较大数组中提取值数组?

时间:2014-10-20 10:17:39

标签: python arrays numpy

具体来说,这些值来自.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.

有人能把我推向正确的方向吗?感谢

1 个答案:

答案 0 :(得分:0)

使用logical_andlogical_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_orlogical_and组合。