辊阵列,均匀圆周移位

时间:2018-12-14 21:22:15

标签: julia

给出一个数组:

arr = [1, 2, 3, 4, 5]

我想转移所有要素。

shift!(arr, 2) => [4, 5, 1, 2, 3]

在Python中,这是通过Numpy使用numpy.roll完成的。朱莉娅如何做到?

3 个答案:

答案 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]