如何在 Julia 匹配谓词中从数组中 select 元素?

How to select elements from array in Julia matching predicate?

Julia 似乎有很多类似 Matlab 的功能。我想使用谓词从数组中 select 。在 Matlab 中,我可以这样做:

>> a = 2:7 ;
>> a > 4

ans =

     0     0     0     1     1     1

>> a(a>4)

ans =

     5     6     7

我在 Julia 中发现了一种看似笨拙的方法来完成其中的一部分:

julia> a = 2:7
2:7

julia> [int(x > 3) for x in a]
6-element Array{Any,1}:
 0
 0
 1
 1
 1
 1

(使用维基百科所说的 list comprehension)。我还没有想出如何在 Julia 中将这样的集合应用于 select,但可能找错了树。如何从 Julia 中的数组做谓词 selection?

如果使用点 . 进行 elementwise 比较,则可以使用非常类似于 Matlab 的语法:

julia> a = 2:7
2:7

julia> a .> 4
6-element BitArray{1}:
 false
 false
 false
  true
  true
  true

julia> a[a .> 4]
3-element Array{Int32,1}:
 5
 6
 7

或者,如果您想要更实用的谓词方法,您可以调用 filter

julia> filter(x -> x > 4, a)
3-element Array{Int32,1}:
 5
 6
 7

Julia 中的数组理解比 Haskell 或 Python 中的列表理解更原始。有两种解决方案——您可以使用高阶过滤函数,或者使用广播操作。

高阶滤波

filter(x -> x > 4, a)

这会调用带有谓词 x -> x > 4filter 函数(请参阅 Julia 手册中的 Anonymous functions)。

广播和索引

a[Bool[a[i] > 4 for i = 1:length(a)]]

这会在 a 和 4 的元素之间执行广播比较,然后使用生成的布尔数组来索引 a。使用广播运算符可以写得更紧凑:

a[a .> 4]

要过滤字典中的键,这对我有用:

mydict = Dict("key1" => 1.0, "key2" => 2.0, "a big string with a part of a string" => 3.0)
filter(x -> occursin("part of a string", string(x)), keys(mydict))

这是 Julia 1.0 中 REPL 的输出结果

julia> mydict = Dict("key1" => 1.0, "key2" => 2.0, "a big string with a part of a string" => 3.0)
Dict{String,Float64} with 3 entries:
  "key2"                                 => 2.0
  "key1"                                 => 1.0
  "a big string with a part of a string" => 3.0

julia> filter(x -> occursin("part of a string", string(x)), keys(mydict))
Set(["a big string with a part of a string"])

这通常是过滤字符串数组的好方法。

希望对您有所帮助。

我目前使用的是 Julia 1.3.1,与之前的答案相比,一些语法发生了变化。要在多个条件下过滤数组,我必须这样做:

x = range(0,1,length=100)
x[(x .> 0.4) .& (x .< 0.51)] 

注意执行 AND 运算符所需的“.&”。

我想补充一个以前的答案没有涉及的方面。如果你想通过索引值(而不是数组值)过滤数组,你可以通过 a[1:end ...] 这样做,而不是你将广播运算符应用于索引值的点。例如。为了删除你要写的第三个元素

a[1:end .!= 3].