如何排序numpy数组列表?

时间:2014-11-06 15:21:12

标签: python arrays list sorting numpy

我想将4x4数组划分为4个2x2数组列表。这个

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

4 个答案:

答案 0 :(得分: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]])]]

答案 1 :(得分:1)

这可以通过重塑和转置直接完成:

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

答案 2 :(得分: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]])]

答案 3 :(得分: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]]