【问题标题】:How to sort a list of list of numpy array?如何对 numpy 数组列表的列表进行排序?
【发布时间】:2015-01-03 04:00:36
【问题描述】:

我想将一个 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| | 

即我以 [8, 9], [12, 13] 的身份获得第 1 块。

代码输出:

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

【问题讨论】:

  • 您可以转换为python普通列表并对主列表中的列表进行排序。

标签: python arrays list sorting numpy


【解决方案1】:

我只会使用数组切片

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

【讨论】:

  • 我已经把它作为输出:)。我想要的是[array([[2, 3], [6, 7]]) 就在array([[0, 1], [4, 5]]) 之后
【解决方案2】:

这可以通过 reshape 和 transpose 直接完成:

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

【讨论】:

  • 哇。实际上我想要这个 4D 数组通过数组列表的列表。你只是简化这个。不错:)
【解决方案3】:

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

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

【讨论】:

    【解决方案4】:
    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]]
    

    【讨论】:

      猜你喜欢
      • 2018-03-15
      • 2021-09-21
      • 2021-07-22
      • 1970-01-01
      • 2011-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多