在Julia中对数组进行切片

nik*_*osd 3 arrays julia

在Julia中,我有一个数组数组,说:

    arr = Array(Array{Float64,1},3)
    for i = 1:3
        arr[i] = [i,-i]
    end
Run Code Online (Sandbox Code Playgroud)

现在:

   arr[:][1]
   2-element Array{Float64,1}:
      1.0
     -1.0
Run Code Online (Sandbox Code Playgroud)

   arr[1][:]
    2-element Array{Float64,1}:
     1.0
    -1.0
Run Code Online (Sandbox Code Playgroud)

似乎获得第一个“列”的唯一方法是通过理解

    pluses = [arr[i][1] for i=1:length(arr)]
    3-element Array{Any,1}:
     1.0
     2.0
     3.0
Run Code Online (Sandbox Code Playgroud)

那确实是唯一的方法吗?我是否通过运行for循环而不是某些“向量化”版本而失去速度,还是在Julia中由于编译器不同而无关紧要吗?

SGJ*_*SGJ 6

在Julia 0.5或更高版本中,您可以getindex.(arr, 1)提取中每个数组的第一个元素arr。这非常有效,特别是因为它可以使用“点调用”语法与其他元素操作相融合。


Mat*_* B. 5

使用[]索引无法做到这一点。每个[]操作都是一个独立的操作(调用getindex)。您已经尝试通过调用来“切片”嵌套数组arr[:][1]。这里有两个独立的操作:首先是,(arr[:])然后是(arr[:])[1]。但是在这种情况下arr[:] == arr!同样地,arr[1][:]您只需获取第一个向量的所有元素。这就是为什么两个人返回同一件事的原因。

您的理解力是一个很好的解决方案。与旧版本的MATLAB不同,Julia的JIT使得for循环的速度比矢量化替代方法要快。如果您来自Matlab或Python,这需要一些习惯。但是,它允许您以非常有效的方式遍历这些复杂的结构。

关于您的评论,在这种情况下,他们使用向量的向量而不是在多维数组中添加列的原因是,目前只有向量可以增长。您可以通过调用将向量的向量复制到二维数组中hcat(arr...),但是如果向量很大(数百万个元素),则复制本身会非常慢。

*(最近的Matlab版本也有JIT,它也可以使某些 for循环比矢量化更快,但是当它启动时是不可预测的。对于这些循环,如今这些日子几乎总是比带有自定义函数的arrayfun / cellfun快。我的经验)。