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

Pee*_*oot 19 arrays julia

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

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

ans =

     0     0     0     1     1     1

>> a(a>4)

ans =

     5     6     7
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

(使用维基百科称之为列表理解).我还没有弄清楚如何在Julia中应用这样的集合来选择,但可能会在错误的树上咆哮.如何从Julia中的数组中进行谓词选择?

DSM*_*DSM 29

如果使用点.进行元素比较,则可以使用类似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
Run Code Online (Sandbox Code Playgroud)

或者,filter如果您想要更具功能性的谓词方法,可以调用:

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

  • 根据记录,元素方法的速度大约是调用过滤器的两倍。 (2认同)

jch*_*jch 12

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

高阶滤波

filter(x -> x > 4, a)
Run Code Online (Sandbox Code Playgroud)

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

广播和索引

a[Bool[a[i] > 4 for i = 1:length(a)]]
Run Code Online (Sandbox Code Playgroud)

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

a[a .> 4]
Run Code Online (Sandbox Code Playgroud)

  • 注意`a=[1; 2; 3]; a[a.>0 & a.<1]` 不会产生预期的结果!这给出了 `1 2 3`,因为 `&` 运算符具有更高的优先级。正确的解决方案是`a[(a.>0) & (a.<1)]`。 (2认同)

小智 7

我目前使用的是 Julia 1.3.1,与之前的答案相比,某些语法发生了变化。要在多个条件下过滤数组,我必须执行以下操作:

x = range(0,1,length=100)
x[(x .> 0.4) .& (x .< 0.51)] 
Run Code Online (Sandbox Code Playgroud)

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