2013-07-12 53 views
3

我有一個for-loop,反覆調用roll,我想反轉創建的數組的順序。如何反轉numpy.roll?

我想我已經忽略了一些微不足道的做法,但到​​目前爲止我只找到了 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] 

回答

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)的第一行)。

,或者你第一個解決方案,如果打印C首先

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] 
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)