尝试查找具有 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 x1
和 x2
,没有地方可以放置额外的类似数组的对象。所以简而言之 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
。
为什么
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 x1
和 x2
,没有地方可以放置额外的类似数组的对象。所以简而言之 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
。