2015-11-03 80 views
1

我有一個大的二維數組是這樣的:重新排序一個numpy的陣列蟒蛇

array([[ 1, 2, 3, 4, 5, 6, 7, 8], 
     [ 9,10,11,12,13,14,15,16], 
     [17,18,19,20,21,22,23,24], 
     [25,26,27,28,29,30,31,32], 
     [33,34,35,36,37,38,39,40], 
     [41,42,43,44,45,46,47,48], 
     ....]) 

,我需要將其轉換爲:

array([ 1, 9,17, 2,10,18, 3,11,19, 4,12,20, 5,13,21, 6,14,22, 7,15,23, 8,16,24], 
     [25,33,41,26,34,42,27,35,43,28,36,44,29,37,45,30,38,46,31,39,47,32,40,48], 
     ... 

注意,這僅是一個證明它應該做什麼。
原始數組僅包含布爾值並且大小爲512x8。在我的例子中,我只將3行和8個元素排成一行,但我真正需要的是分別32行和8個元素。

我真的很抱歉,但寫了30分鐘後,這是我對我的問題的唯一描述。我希望這已經足夠了。

+1

如果我讀了反向這個問題很有道理 – Henry

+0

@Henry:哈哈^^你差不多吧。我認爲它比其他方式更有意義。 – InvAdErZz

回答

5

我認爲你可以使用兩個reshape操作達到您想要的結果和transpose

x = np.array([[ 1, 2, 3, 4, 5, 6, 7, 8], 
       [ 9,10,11,12,13,14,15,16], 
       [17,18,19,20,21,22,23,24], 
       [25,26,27,28,29,30,31,32], 
       [33,34,35,36,37,38,39,40], 
       [41,42,43,44,45,46,47,48]]) 

y = x.reshape(2, 3, 8).transpose(0, 2, 1).reshape(2, -1) 

print(repr(y)) 
# array([[ 1, 9, 17, 2, 10, 18, 3, 11, 19, 4, 12, 20, 5, 13, 21, 6, 14, 
#   22, 7, 15, 23, 8, 16, 24], 
#  [25, 33, 41, 26, 34, 42, 27, 35, 43, 28, 36, 44, 29, 37, 45, 30, 38, 
#   46, 31, 39, 47, 32, 40, 48]]) 

打破這一下來了一點:

  1. @ hpaulj的第一reshape操作給了我們這樣的:

    x1 = x.reshape(2, 3, 8) 
    print(repr(x1)) 
    # array([[[ 1, 2, 3, 4, 5, 6, 7, 8], 
    #   [ 9, 10, 11, 12, 13, 14, 15, 16], 
    #   [17, 18, 19, 20, 21, 22, 23, 24]], 
    
    #  [[25, 26, 27, 28, 29, 30, 31, 32], 
    #   [33, 34, 35, 36, 37, 38, 39, 40], 
    #   [41, 42, 43, 44, 45, 46, 47, 48]]]) 
    print(x1.shape) 
    # (2, 3, 8) 
    
  2. 爲了得到所需的輸出,我們需要沿着第二維(大小爲3)'摺疊'這個數組,然後沿着第三維(大小爲8)。 實現這樣的事情,最簡單的方法是首先transpose的 陣列,讓你想沿着摺疊尺寸從第一下令持續:

    x2 = x1.transpose(0, 2, 1) # you could also use `x2 = np.rollaxis(x1, 1, 3)` 
    print(repr(x2)) 
    # array([[[ 1, 9, 17], 
    #  [ 2, 10, 18], 
    #  [ 3, 11, 19], 
    #  [ 4, 12, 20], 
    #  [ 5, 13, 21], 
    #  [ 6, 14, 22], 
    #  [ 7, 15, 23], 
    #  [ 8, 16, 24]], 
    
    # [[25, 33, 41], 
    #  [26, 34, 42], 
    #  [27, 35, 43], 
    #  [28, 36, 44], 
    #  [29, 37, 45], 
    #  [30, 38, 46], 
    #  [31, 39, 47], 
    #  [32, 40, 48]]]) 
    print(x2.shape) 
    # (2, 8, 3) 
    
  3. 最後,我可以用reshape(2, -1)崩潰數組在過去的兩個維度。 -1會導致numpy根據x中的元素數推斷最後一個維度的適當大小。

    y = x2.reshape(2, -2) 
    
+0

謝謝。看起來合法;)我會明天嘗試;) – InvAdErZz

+0

正是我需要的!坦克你再次:) – InvAdErZz

1

看起來像一個出發點是重新塑造它,例如

In [49]: x.reshape(2,3,8) 
Out[49]: 
array([[[ 1, 2, 3, 4, 5, 6, 7, 8], 
     [ 9, 10, 11, 12, 13, 14, 15, 16], 
     [17, 18, 19, 20, 21, 22, 23, 24]], 

     [[25, 26, 27, 28, 29, 30, 31, 32], 
     [33, 34, 35, 36, 37, 38, 39, 40], 
     [41, 42, 43, 44, 45, 46, 47, 48]]]) 

.ravel(order='F')沒有得到它的權利,所以我認爲我們需要壓扁之前交換一些軸。它需要是一個副本。

使用@ ali_m的轉置:

In [65]: x1=x.reshape(2,3,8) 

In [66]: x1.transpose(0,2,1).flatten() 
Out[66]: 
array([ 1, 9, 17, 2, 10, 18, 3, 11, 19, 4, 12, 20, 5, 13, 21, 6, 14, 
     22, 7, 15, 23, 8, 16, 24, 25, 33, 41, 26, 34, 42, 27, 35, 43, 28, 
     36, 44, 29, 37, 45, 30, 38, 46, 31, 39, 47, 32, 40, 48]) 

哎呀 - 有嵌套的內層,很容易錯過

array([1,9,17,2,10,18,3,11,19,4,12,20,5,13,21,6,14,22,7,15,23,8,16,24], 
     [25,33,41,26,34,42,27,35,43,28,36,44,29,37,45,30,38,46,31,39,47,32,40,4], 

你缺少[]集。所以@ali_m說得對。

我很想刪除它,但我的試驗和錯誤可能是有益的。

+0

是的,我嘗試了一個resahpe和一個交換的軸,但這導致整個矩陣交換,但我只需要一次交換32行。 – InvAdErZz