在索引数组中组合逻辑操作 - Julia

combining logical operations in indexing array - Julia

给定一个 Julia 中的一维数组,找到位于 a (= 4) 和 b( = 7) 之间的所有元素。

a = 4;b = 7;
x = collect(1:10)
x[isless.(x,a)] 

将找到数组中小于 a = 4 的所有元素。

如何在索引中合并两个逻辑操作。

 x[isless.(x,a) && !isless.(x,b)] 

没有锻炼。

您需要使用广播 &&(或者,在较旧的 Julia 版本中,&):

julia> x[isless.(x,b) .&& (!isless).(x,a)]
3-element Vector{Int64}:
 4
 5
 6

julia> x[isless.(x,a) .& (!isless).(x,b)]
Int64[]

另一件要注意的事情是 !. 的优先级——您需要使用 (!isless).(x, a).!isless.(x, a) 来获得正确的广播行为。

如果您可以使用 < 运算符而不是 isless(这很可能是这种情况,除非您使用 NaNmissing-0.0) 那么你可以这样写:

julia> x[a .< x .< b]
2-element Vector{Int64}:
 5
 6

或者您可以使用 filter:

julia> filter(v -> a < v < b, x)
2-element Vector{Int64}:
 5
 6

这让我想到了添加此评论的原因。您要求 就地 操作。这对于索引是不可能的,但是如果您使用 Vector:

,则可以使用 filter! 实现它
julia> filter!(v -> a < v < b, x)
2-element Vector{Int64}:
 5
 6

julia> x
2-element Vector{Int64}:
 5
 6