2013-02-15 3 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

ответ

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

Спасибо, I th чернила понимание списка - это то, что я ищу, очень ценю :) – SpFW

+0

круто осмысление ... – mshsayem

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]]) 
Смежные вопросы