给定一个数组:
arr = [1, 2, 3, 4, 5]
我想移动所有的元素。
shift!(arr, 2) => [4, 5, 1, 2, 3]
在Python语言中,这是通过使用numpy.roll的Numpy完成的。朱莉娅是怎么做到的?
发布于 2018-12-15 06:18:06
不需要自己实现它,它有一个内置的函数
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)。
发布于 2018-12-15 06:06:34
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];现在是times (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。
发布于 2018-12-15 05:34:18
您可以为此编写一个简单的函数:
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]https://stackoverflow.com/questions/53787042
复制相似问题