在朱莉娅,我有一组数组,比如说:
arr = Array(Array{Float64,1},3)
for i = 1:3
arr[i] = [i,-i]
end
现在:
arr[:][1]
2-element Array{Float64,1}:
1.0
-1.0
和
arr[1][:]
2-element Array{Float64,1}:
1.0
-1.0
似乎获得第一个“专栏”的唯一方法是理解
pluses = [arr[i][1] for i=1:length(arr)]
3-element Array{Any,1}:
1.0
2.0
3.0
这确实是唯一的方法吗?通过运行for循环而不是某些“矢量化”版本,我是否会失去速度,或者由于编译器不同而在Julia中无关紧要?
答案 0 :(得分:4)
使用[]
索引无法做到这一点。每个[]
操作都是一个独立的操作(调用getindex)。您已尝试通过调用arr[:][1]
来“切片”嵌套数组。这里有两个独立的操作:第一个是(arr[:])
,然后是(arr[:])[1]
。但在这种情况下arr[:] == arr
!类似地,arr[1][:]
- 你只是得到第一个向量的所有元素。这就是为什么两人都回归同样的事情。
你的理解是一个很好的解决方案。与旧的* MATLAB版本不同,Julia的JIT使得循环比矢量化的替代方案更快。如果您来自Matlab或Python,需要一些时间来习惯。但它允许您以非常有效的方式遍历这些复杂的结构。
关于你的评论,他们在这种情况下使用向量向量而不是向多维数组添加列的原因是目前只有向量可以增长。您可以通过调用hcat(arr...)
将Vector of Vector复制到二维数组中,但如果您的矢量非常大(数百万个元素),则副本本身会相当慢。
*(Matlab的最新版本也有一个JIT,它也可以使某些的循环比矢量化更快,但是当它开始时是不可预测的。对于循环这几天几乎总是如此根据我的经验,使用自定义函数比arrayfun / cellfun更快。
答案 1 :(得分:4)
在Julia 0.5或更高版本中,您可以getindex.(arr, 1)
提取arr
中每个数组的第一个元素。这非常有效,特别是因为它可以fuse with other elementwise operations using the "dot call" syntax.