我有一个for-loop
重复调用roll
,我想反转创建的数组的顺序。
我认为我忽略了一些微不足道的方法,但到目前为止我只发现 10000 3 5种不这样做的方式。
In [1]: from numpy import roll
In [2]: c = range(5)
## The code I want to invert
In [3]: for i in range(len(c)):
...: c = roll(c, 1)
...: print c
[4 0 1 2 3]
[3 4 0 1 2]
[2 3 4 0 1]
[1 2 3 4 0]
[0 1 2 3 4]
## The result I want
[0 1 2 3 4]
[1 2 3 4 0]
[2 3 4 0 1]
[3 4 0 1 2]
[4 0 1 2 3]
## What I've tried:
In [4]: for i in range(len(c)):
...: c = roll(c, -1)
...: print c
[1 2 3 4 0]
[2 3 4 0 1] # <- false
[3 4 0 1 2]
[4 0 1 2 3]
[0 1 2 3 4]
In [5]: for i in reversed(range(len(c))):
...: c = roll(c, -i)
...: print c
[4 0 1 2 3] # <- false
[2 3 4 0 1]
[4 0 1 2 3]
[0 1 2 3 4]
[0 1 2 3 4]
In [6]: for i in reversed(range(len(c))):
c = roll(c, i)
print c
...:
[1 2 3 4 0]
[3 4 0 1 2] # <- false
[1 2 3 4 0]
[0 1 2 3 4]
[0 1 2 3 4]
In [7]: for i in range(len(c)):
...: c = roll(c, i)
...: print c
...:
[0 1 2 3 4]
[4 0 1 2 3] # <- false
[2 3 4 0 1]
[4 0 1 2 3]
[0 1 2 3 4]
In [8]: for i in range(len(c)):
...: c = roll(c, -i)
...: print c
...:
[0 1 2 3 4]
[1 2 3 4 0]
[3 4 0 1 2] # <- false
[1 2 3 4 0]
[0 1 2 3 4]
答案 0 :(得分:3)
怎么样
for i in range(len(c)):
print c
c = roll(c, len(c) - 1)
[0 1 2 3 4]
[1 2 3 4 0]
[2 3 4 0 1]
[3 4 0 1 2]
[4 0 1 2 3]
将所有内容一直滚动(但只有一个)并在第一次滚动之前进行打印(因此第一行的c
为range(5)
)。
甚至是您的第一个解决方案,如果您先打印
for i in range(len(c)):
print c
c = roll(c, -1)
[0 1 2 3 4]
[1 2 3 4 0]
[2 3 4 0 1]
[3 4 0 1 2]
[4 0 1 2 3]
答案 1 :(得分:0)
Fwiw,一个不同的问题:反转np.rollaxis,我发现只有这个,使用 transpose:
import numpy as np
a = np.ones((3,4,5,6))
print a.shape
for ax in range( a.ndim ):
print "ax %d:" % ax ,
jtrans = np.arange( a.ndim )
jtrans[0], jtrans[ax] = jtrans[ax], jtrans[0]
b = a.transpose( jtrans )
print b.shape, jtrans ,
a = b.transpose( jtrans ) # and back
print a.shape
# (3, 4, 5, 6)
# ax 0: (3, 4, 5, 6) [0 1 2 3] (3, 4, 5, 6)
# ax 1: (4, 3, 5, 6) [1 0 2 3] (3, 4, 5, 6)
# ax 2: (5, 4, 3, 6) [2 1 0 3] (3, 4, 5, 6)
# ax 3: (6, 4, 5, 3) [3 1 2 0] (3, 4, 5, 6)