2013-02-15 33 views
1

如果我有一個方形矩陣作爲python中的嵌套列表,我可以將它分成幾個相同大小的框,並創建一個新列表,其中每個元素是其中一個框中的數字列表。例如。適用於切片嵌套列表的功能?

a = [[1, 2, 3, 4], 
    [5, 6, 7, 8], 
    [9, 10, 11, 12], 
    [13, 14, 15 ,16]] 

b = [[a[0][0], a[0][1], a[1][0], a[1][1]], 
    [a[0][2], a[0][3], a[1][2], a[1][3]], 
    [a[2][0], a[2][1], a[3][0], a[3][1]], 
    [a[2][2], a[2][3], a[3][2], a[3][3]]] 

有沒有更簡單的方法來做到這一點?有沒有辦法將它設置爲一個函數,我可以將它應用於不同大小的矩陣,並指定框的大小?

+0

可能沒有按」不過,我忘了提及這是用於Python 2.x – SpFW 2013-02-15 18:41:39

回答

1

以下是等同於你所擁有的,有點更簡潔:

b = [a[0][:2] + a[1][:2], 
    a[0][2:] + a[1][2:], 
    a[2][:2] + a[3][:2], 
    a[2][2:] + a[3][2:]] 

或等效的列表理解:

b = [a[i][s] + a[i+1][s] for i in (0,2) for s in (slice(None,2), slice(2,None))] 
+0

謝謝,我th墨水列表理解是我正在尋找,非常感謝:) – SpFW 2013-02-15 18:51:26

+0

很酷的理解... – mshsayem 2013-02-15 18:56:09

1

使用NumPy

In [31]: import numpy as np 

In [32]: a = np.arange(1,17).reshape(4,4) 

In [33]: a 
Out[33]: 
array([[ 1, 2, 3, 4], 
     [ 5, 6, 7, 8], 
     [ 9, 10, 11, 12], 
     [13, 14, 15, 16]]) 

In [34]: b = a.reshape(-1,2,2,2).swapaxes(1,2).reshape(4,4) 

In [35]: b 
Out[35]: 
array([[ 1, 2, 5, 6], 
     [ 3, 4, 7, 8], 
     [ 9, 10, 13, 14], 
     [11, 12, 15, 16]])