如何反转numpy.roll?

时间:2013-07-12 10:18:55

标签: numpy

我有一个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]

2 个答案:

答案 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]

将所有内容一直滚动(但只有一个)并在第一次滚动之前进行打印(因此第一行的crange(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)