Julia 滚动阵列,均匀圆位移

Julia 滚动阵列,均匀圆位移,julia,Julia,给定一个数组: arr=[1,2,3,4,5] 我想改变所有的元素 shift!(arr,2)=>[4,5,1,2,3] 在Python中,这是使用Numpy实现的。Julia是如何实现的?您可以为此编写一个简单的函数: 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(r

给定一个数组:

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

我想改变所有的元素

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


在Python中,这是使用Numpy实现的。Julia是如何实现的?

您可以为此编写一个简单的函数:

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]

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输出):


当然,最快的方法是就地更改
arr

不需要自己实现,它有一个内置的功能

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

julia> @btime circshift($arr, 2);
  68.563 ns (1 allocation: 128 bytes)

julia> @btime roll2($arr, 2);
  70.605 ns (4 allocations: 256 bytes)