朱莉娅:截取数组中数组的内部维度

3
给定一个二维数组: x = [[1, 2, 3, 4], [4, 5, 6, 7]]
如何高效地截取每个内部数组,以便最终获得以下结果: [[1, 2], [4, 5]]
是否有类似于多维数组的x[:,1:2]这样简单的方法?
2个回答

6
您可以使用广播(broadcast)getindex
julia> x = [[1, 2, 3, 4], [5, 6, 7, 8]];

julia> getindex.(x, (1:2,))
2-element Array{Array{Int64,1},1}:
 [1, 2]
 [5, 6]

似乎比使用 map 快一些:
julia> foo(xs) = getindex.(xs, (1:2,))
foo (generic function with 1 method)

julia> bar(xs) = map(x -> x[1:2], xs)
bar (generic function with 1 method)

julia> @btime foo($([rand(1000) for _ in 1:1000]));
  55.558 μs (1001 allocations: 101.69 KiB)

julia> @btime bar($([rand(1000) for _ in 1:1000]));
  58.841 μs (1002 allocations: 101.70 KiB)

3
如果您可以接受修改输入向量,则这是一种非常高效的方法:
resize!.(x, 2)

这个函数会在原地改变x,所以你不需要为它分配一个输出变量。

你也可以使用view。这不会改变输入,但也不会分配新的向量。它比广播的getindex快,但比resize!慢:

xv = view.(x, Ref(1:2))

请问您能解释一下这里 Ref 的用法吗? - Grayscale
你想仅在 x 的元素上广播,而不是在 1:2 上广播。Ref 使其表现得像一个标量。 - DNF
啊,我明白了,所以它的作用和David Varela把它放在元组中是一样的? - Grayscale
是的,在这里并不重要,只有微小的差别。 - DNF

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接