如何在 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 > 4
的 filter
函数(请参阅 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].
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 > 4
的 filter
函数(请参阅 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].