如何从Julia匹配谓词中的数组中选择元素?

时间:2015-01-11 06:10:44

标签: arrays julia

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

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

ans =

     0     0     0     1     1     1

>> a(a>4)

ans =

     5     6     7

我在朱莉娅找到了一种笨重的看似方式来做部分工作:

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中的数组中进行谓词选择?

5 个答案:

答案 0 :(得分:27)

如果使用点.进行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

答案 1 :(得分:12)

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

高阶过滤

filter(x -> x > 4, a)

这会使用谓词filter调用x -> x > 4函数(请参阅Julia手册中的匿名函数)。

广播和索引

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

这将在a和4的元素之间执行广播比较,然后使用生成的布尔数组来索引a。它可以使用广播运营商更紧凑地编写:

a[a .> 4]

答案 2 :(得分:4)

我当前正在使用Julia 1.3.1,与先前的答案相比,某些语法已更改。要在多个条件下过滤数组,我必须做:

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

请注意执行AND运算符所需的'。&'。

答案 3 :(得分:0)

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

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"])

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

希望有帮助。

答案 4 :(得分:0)

我想补充一个以前的答案没有涉及的方面。如果您想通过索引值(而不是数组值)过滤数组,您可以通过 <table> <tr> <td></td> <td>Heading</td> <td>Heading 2</td> </tr> <tr> <td rowspan="8" class="rowspan">Some Data</td> <td>546</td> <td>X</td> </tr> <tr> <td>546</td> <td></td> </tr> <tr> <td>546</td> <td>X</td> </tr> <tr> <td>546</td> <td></td> </tr> <tr> <td>546</td> <td>X</td> </tr> <tr> <td>546</td> <td></td> </tr> <tr> <td>546</td> <td></td> </tr> <tr> <td>546</td> <td></td> </tr> <tr> <td rowspan="8" class="rowspan">Other Data</td> <td>123</td> <td>Y</td> </tr> <tr> <td>123</td> <td></td> </tr> <tr> <td>123</td> <td>Y</td> </tr> <tr> <td>123</td> <td></td> </tr> <tr> <td>123</td> <td>Y</td> </tr> <tr> <td>123</td> <td></td> </tr> <tr> <td>123</td> <td></td> </tr> <tr> <td>123</td> <td></td> </tr> </table> 来实现,其中您将广播运算符应用于索引值而不是点。例如。为了删除你会写的第三个元素

a[1:end ...]