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)