2014-11-06 70 views
0

我想将一个4x4阵列分成四个2x2阵列列表。此如何排序numpy数组列表?

| 0 1 2 3 | 
| 4 5 6 7 | 
| 8 9 10 11 | 
|12 13 14 15 | 

应该分为四个块作为

| |0 1| |2 3 | | 
| |4 5| |6 7 | | 
|     | 
| | 8 9| |10 11| | 
| |12 13| |14 15| | 

所以,如果我访问块1,那么它应该是[2,3],[6,7]

我写此方法:

from numpy import * 
from operator import itemgetter 

def divide_in_blocks(A): 
    A1 = hsplit(A, A[0].size/2) 
    for i, x in enumerate(A1): 
     A1[i] = vsplit(x, x.size/4) 
    return A1 

if __name__ == '__main__': 
    a = arange(16).reshape(4,4) 
    a1 = divide_in_blocks(a) 
    #print a 
    #a1 = sorted(a1, key=itemgetter(2)) 
    print a1 

其将阵列

| |0 1| | 8 9 | | 
| |4 5| |12 13 | | 
|     | 
| |2 3| |10 11| | 
| |6 7| |14 15| | 

即我正在块1作为[8, 9], [12, 13]

输出代码:

[[array([[0, 1], 
     [4, 5]]), 
    array([[ 8, 9], 
     [12, 13]])], 
[array([[2, 3], 
     [6, 7]]), 
    array([[10, 11], 
     [14, 15]])]] 

有什么办法来排序数组列表此列表以获得所需的输出:

[[array([[0, 1], 
     [4, 5]]), 
    array([[2, 3], 
     [6, 7]])], 
[array([[ 8, 9], 
     [12, 13]]), 
    array([[10, 11], 
     [14, 15]])]] 

+0

您可以转换为python常规列表,并对主列表中的列表进行排序。 – ha9u63ar 2014-11-06 15:33:18

回答

1

这可以做到ne直接与重塑和转置:

> a = np.arange(16).reshape((4, 4)) 
> a 
array([[ 0, 1, 2, 3], 
     [ 4, 5, 6, 7], 
     [ 8, 9, 10, 11], 
     [12, 13, 14, 15]]) 

> a.reshape((2, 2, 2, 2)).transpose((0, 2, 1, 3)) 
array([[[[ 0, 1], 
     [ 4, 5]], 

     [[ 2, 3], 
     [ 6, 7]]], 


     [[[ 8, 9], 
     [12, 13]], 

     [[10, 11], 
     [14, 15]]]]) 
+0

哇。其实我想通过数组列表的列表这个4D阵列。你只是简化了这一点。尼斯:) – haccks 2014-11-06 18:06:52

2

我只想用数组片段

>>> blocksize = 2 
>>> h, w = a.shape 
>>> rows = xrange(0, h, blocksize) 
>>> cols = xrange(0, w, blocksize) 
>>> [[a[row:row+blocksize, col:col+blocksize] for col in cols] for row in rows] 

[[array([[0, 1], 
     [4, 5]]), array([[2, 3], 
     [6, 7]])], [array([[ 8, 9], 
     [12, 13]]), array([[10, 11], 
     [14, 15]])]] 
+0

我已经得到这个作为输出:)。我想要的是'array [[0,1], [4,5]])'[array([[2,3], [6,7]])''''' – haccks 2014-11-06 15:42:22

+0

哦,对。只需更改循环的顺序(请参阅编辑)。 – wim 2014-11-06 17:53:15

0

有点脏,但它可以通过列表理解来完成:

a = arange(16).reshape(4,4) 

a = [a[x:x+2,y:y+2] for x in range(0,4,2) for y in range(0,4,2)] 

a 
[array([[0, 1], 
     [4, 5]]), array([[2, 3], 
     [6, 7]]), array([[ 8, 9], 
     [12, 13]]), array([[10, 11], 
     [14, 15]])] 
0
import numpy as np 

def split2x2(a,n): 
    if n%2: return None 
    shapes = ((0,n/2,0,n/2), (0,n/2,n/2,n), 
       (n/2,n,0,n/2), (n/2,n,n/2,n)) 
    return [a[r0:r1,c0:c1] for r0, r1, c0, c1 in shapes] 

a = np.array(((0,0,0,0,1,1,1,1), 
       (0,0,0,0,1,1,1,1), 
       (0,0,0,0,1,1,1,1), 
       (0,0,0,0,1,1,1,1), 
       (2,2,2,2,3,3,3,3), 
       (2,2,2,2,3,3,3,3), 
       (2,2,2,2,3,3,3,3), 
       (2,2,2,2,3,3,3,3),)) 

l_a = split2x2(a,len(a)) 
print l_a[1] 

输出

# [[1 1 1 1] 
# [1 1 1 1] 
# [1 1 1 1] 
# [1 1 1 1]]