给出一个数组:
arr = [1, 2, 3, 4, 5]
我想转移所有要素。
shift!(arr, 2) => [4, 5, 1, 2, 3]
在Python中,这是通过Numpy使用numpy.roll
完成的。朱莉娅如何做到?
答案 0 :(得分:4)
无需自己实现,有一个内置功能
julia> circshift(arr, 2)
5-element Array{Int64,1}:
4
5
1
2
3
与上面建议的roll2
相比,效率(略)更高:
julia> @btime circshift($arr, 2);
68.563 ns (1 allocation: 128 bytes)
julia> @btime roll2($arr, 2);
70.605 ns (4 allocations: 256 bytes)
但是,请注意,所有提议的功能都无法就地运行。它们都创建一个新的数组。还有一个内置的circshift!(dest, src, shift)
可以在预先分配的dest
中运行(但是必须为!= src
)。
答案 1 :(得分:2)
Seanny123的功能可以进行很多复制,可以改进它们以减少内存占用并更快地执行。考虑:
function roll2(arr, step)
len = length(arr)
[view(arr,len-step+1:len); view(arr,1:len-step)]
end
arr = [1,2,3,4,5,6,7,8,9,10];
现在是时间(REPL输出):
julia> using BenchmarkTools
julia> @btime roll($arr,2);
124.254 ns (3 allocations: 400 bytes)
julia> @btime roll2($arr,2);
73.386 ns (4 allocations: 288 bytes)
当然,最快的方法是就地更改arr
。
答案 2 :(得分:1)
您可以为此编写一个简单的函数:
function roll(arr, step)
return vcat(arr[end-step+1:end], arr[1:end-step])
end
println(roll(1:5, 2))
# => [4, 5, 1, 2, 3]
println(roll(1:6, 4))
# => [3, 4, 5, 6, 1, 2]