首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >滚轮阵列,均匀循环移位

滚轮阵列,均匀循环移位
EN

Stack Overflow用户
提问于 2018-12-15 05:22:15
回答 3查看 1.6K关注 0票数 3

给定一个数组:

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

我想移动所有的元素。

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-12-15 06:18:06

不需要自己实现它,它有一个内置的函数

代码语言:javascript
运行
复制
julia> circshift(arr, 2)  
5-element Array{Int64,1}: 
 4                        
 5                        
 1                        
 2                        
 3        

它也(稍微)比上面提出的roll2更有效:

代码语言:javascript
运行
复制
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)。

票数 8
EN

Stack Overflow用户

发布于 2018-12-15 06:06:34

Seanny123的函数做了大量的复制,可以改进为具有更小的内存占用和更快的执行速度。考虑一下:

代码语言:javascript
运行
复制
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输出):

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2018-12-15 05:34:18

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

代码语言:javascript
运行
复制
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]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53787042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档