尝试查找具有 2 个以上逻辑条件的 python numpy 索引

Trying to find python numpy indexes with more than 2 logical conditions

为什么

w = data[np.where(np.logical_and(data['RA']>=(ra_in-0.1), data['RA']<=(ra_in+0.1)))]

工作,但是

w = data[np.where(np.logical_and(data['RA']>=(ra_in-0.1), data['RA']<=(ra_in+0.1), data['DEC']>=(dec_in-0.1), data['DEC']<=(dec_in+0.1)  ))]

不是吗??? 这会产生 "ValueError: invalid number of arguments" 错误。 'in' 值是浮点数;数据是 numpy.ndarrays。

documentation of numpy.logical_and 说:

numpy.logical_and(x1, x2, /, out=None, *, where=True, casting='same_kind', order='K', dtype=None, subok=True[, signature, extobj])

如您所见,除了 how 上的附加参数外,如何在两个 array-like 上执行 logical_and objects x1x2,没有地方可以放置额外的类似数组的对象。所以简而言之 logical_and 只在两个数组 .

上执行逻辑与

您可以使用 logica_and 的级联 来执行请求的操作:

data[np.where(
    np.logical_and(
        np.logical_and(data['RA']>=(ra_in-0.1), data['RA']<=(ra_in+0.1),
        np.logical_and(data['DEC']>=(dec_in-0.1), data['DEC']<=(dec_in+0.1)
    ))]

所以这里我们把无效的logical_and(A,B,C,D)转换成logical_and(logical_and(A,B),logical_and(C,D)).

此外你可以使用更优雅的逻辑和&:

data[np.where(
    (data['RA']>=(ra_in-0.1)) & (data['RA']<=(ra_in+0.1)) & (data['DEC']>=(dec_in-0.1)) & (data['DEC']<=(dec_in+0.1))
    )]

请注意,由于&绑定的优先级更高,因此您需要添加括号。但是请注意,我们仍然有一些级联,因为:

(data['RA']>=(ra_in-0.1)) & (data['RA']<=(ra_in+0.1)) & (data['DEC']>=(dec_in-0.1)) & (data['DEC']<=(dec_in+0.1))

相当于:

(((data['RA']>=(ra_in-0.1)) & (data['RA']<=(ra_in+0.1))) & (data['DEC']>=(dec_in-0.1))) & (data['DEC']<=(dec_in+0.1))

或更抽象:A & B & C & D等同于((A & B) & C) & D