如何根据Julia中的条件选择数组的子集

如何根据Julia中的条件选择数组的子集,julia,Julia,如何根据条件简单地选择数组的子集?我知道Julia不使用矢量化,但必须有一种简单的方法来执行以下操作,而不必使用难看的多行for循环 期望输出: [2, 4] [nothing, 2, nothing, 4] 观测输出: [2, 4] [nothing, 2, nothing, 4] 您可以使用find函数或.==语法来完成此操作。例如: julia> x = collect(1:4) 4-element Array{Int64,1}: 1 2 3 4 julia

如何根据条件简单地选择数组的子集?我知道Julia不使用矢量化,但必须有一种简单的方法来执行以下操作,而不必使用难看的多行for循环

期望输出:

[2, 4]
[nothing, 2, nothing, 4]
观测输出:

[2, 4]
[nothing, 2, nothing, 4]
您可以使用find函数或.==语法来完成此操作。例如:

julia> x = collect(1:4)
4-element Array{Int64,1}:
 1
 2
 3
 4    

julia> y = x[find(x%2.==0)]
2-element Array{Int64,1}:
 2
 4

julia> y = x[x%2.==0]  ## more concise and slightly quicker
2-element Array{Int64,1}:
 2
 4
注意元素操作的语法。另外,请注意find返回与条件匹配的索引。在这种情况下,匹配条件的索引与匹配条件的数组元素相同。但对于更一般的情况,我们希望将find函数放在括号中,表示我们正在使用它从原始数组x中选择索引

更新:Lutfullah Tomak关于过滤器功能的观点很好。我相信,虽然这样的发现可以更快,更有效的记忆。虽然我知道匿名函数在版本0.5中应该会变得更好,所以这可能会改变吗?至少在我的审判中,我得到了:

x = collect(1:100000000);
@time y1 = filter(x->x%2==0,x);  
# 9.526485 seconds (100.00 M allocations: 1.554 GB, 2.76% gc time)    

@time y2 = x[find(x%2.==0)]; 
# 3.187476 seconds (48.85 k allocations: 1.504 GB, 4.89% gc time)

@time y3 = x[x%2.==0];
# 2.570451 seconds (57.98 k allocations: 1.131 GB, 4.17% gc time)    
更新2:在对这篇文章的评论中,很好地指出x[x%2.==0]比x[findx%2.==0]快

您正在寻找过滤器

下面是一个例子
filterx->x%2==0,[1,2,3,5]与[2]有以a开头的元素运算符:

julia> [1,2,3,4] % 2 .== 0
4-element BitArray{1}:
 false
  true
 false
  true

julia> x = [1,2,3,4]
4-element Array{Int64,1}:
 1
 2
 3
 4

julia> x % 2 .== 0
4-element BitArray{1}:
 false
  true
 false
  true

julia> x[x % 2 .== 0]
2-element Array{Int64,1}:
 2
 4

julia> x .% 2
4-element Array{Int64,1}:
 1
 0
 1
 0

为什么不只是x[x%2.==0]?这里的发现是不必要的,而且速度很慢。我在julia 0.5中计时的过滤器速度最快,而第三个过滤器的速度很慢,因为编译匿名函数需要很长时间。在v0.5中,匿名函数的速度将与正常函数的速度一样快。相关的github问题页面为。因此,过滤器几乎肯定是v0.5+的发展方向。很高兴知道!v0.5是否有预计到达时间?@MattB。你说得对!谢谢我现在改了。什么意思,朱莉娅不使用矢量化?那不是真的。在不使用矢量化的情况下,通常可以获得最快的性能,但性能或简洁性是否最重要取决于您自己。@tholy说的+1。矢量化提高了可读性,但有时会产生次优性能。我记得从性能角度回答了一个关于发现的问题。根据您的设计考虑,您可以为x%2==0编写自己的高效例程,或者只使用Julia的可读性很强的筛选器,或者像下面所述的那样查找函数。我的意思是更多地从语法角度而不是从优化角度进行向量化。尽管@daycaster指出,我实际上可以按照matlab允许的方式索引到数组中,但我没有意识到,我只是尝试了==以这种方式索引,而不是。我不确定该选哪个答案,它们在不同的方面都是正确的,非常有用。