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

2024-09-30 01:33:48 发布

您现在位置:Python中文网/ 问答频道 /正文

具体地说,这些值来自一个.fits文件,我正在使用astropy。你知道吗

从本质上讲,我得到了一个大的数据数组,其中的对象每个都包含多个分类列和一个对应的行,行中有一个字符串或整数来标识它们。例如,数组中的一个对象可以是

CLASS  == GALAXY
SPECPRIMARY = 1
PROGNAME == MAIN
ZWARNING == 0
PRIMTARGET == 128
SUBCLASS = STRINGHERE
FIBERID == INTEGERHERE
etc...

但是,每个对象都有许多列和可能的标识符。所以,我想用np.哪里仅获取包含具有这些可能标识符的数组的数组

                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。你知道吗

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


Tags: or文件对象datamainnp数组标识符
1条回答
网友
1楼 · 发布于 2024-09-30 01:33:48

使用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的内置函数,它将给定的函数成对地应用于iterable中的所有输入。所以得到所有输入的logical_orlogical_and组合。你知道吗

相关问题 更多 >

    热门问题