簡體   English   中英

如何對numpy數組列表進行排序?

[英]How to sort a list of list of numpy array?

我想將4x4數組划分為四個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]])]]  

我只用數組切片

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

這可以直接通過重塑和轉置來完成:

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

有點臟,但是可以通過列表理解來完成:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM