给定数组:
np.array([[1, 2],
[3, 4],
[5, 6],
[7, 8],
[9, 10]])
如果我想将索引1处的行移动到索引3处,则输出应为:
[[1, 2],
[5, 6],
[7, 8],
[3, 4],
[9, 10]]
如果我想将索引4处的行移动到索引1处,则输出应为:
[[1, 2],
[9, 10],
[3, 4],
[5, 6],
[7, 8]]
执行此移动操作的最快方法是什么?
3条答案
按热度按时间mjqavswn1#
如果你仔细观察,如果你想把行
i
放在位置j
,那么只有在i
和j
之间的行会受到影响;外部的行不需要改变。并且这个改变基本上是roll
操作。对于a,b,c,d,e
项,将i=1
处的项放置到j=3
意味着b,c,d
将变成c,d,b
,得到a,c,d,b,e
。移位是-1
还是+1
取决于i<j
。xqnpmsa82#
第一个轴上的
tuple()
索引如何?例如:
以及:
分别为您的预期输出。
对于从两个索引开始生成索引的方法,您可以使用以下方法:
对于沿操作轴方向相对较小的输入(如问题中的输入),这是相当快的。
将它与@Mercury的答案的一个稍微改进的版本进行比较,以便将它 Package 在一个函数中,并使它对任意
axis
都能正确工作:并获得一些计时:
这表明
inner_roll()
是处理输入的最快方法,然而,inner_roll2()
似乎可以更好地适应输入大小,即使对于中等大小的输入,inner_roll2()
也比inner_roll()
快。请注意,
inner_roll()
创建拷贝时,inner_roll2()
就地工作(修改输入arr
)。可以通过在inner_roll2()
的主体的开始处添加arr = arr.copy()
来修改该行为,这将使该函数变慢(当然),并且其计时将更多地受到m
的值(非滚动轴的大小)的影响。另一方面,如果您要执行多个连续的滚动操作,
inner_roll2()
的时间就会累加起来,而对于inner_roll()
,您只需要执行一次代价高昂的操作。f8rj6qna3#
我喜欢@Mercury的解决方案,但发现避免与
np.roll()
相关的数组复制并完全就地操作会更快: