我想将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]])]]
?
答案 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]]