我有一个 numpy 矩阵,看起来像:
[[ 0 1 2 3 4 5 6 7]
[ 8 9 10 11 12 13 14 15]
[16 17 18 19 20 21 22 23]
[24 25 26 27 28 29 30 31]
[32 33 34 35 36 37 38 39]
[40 41 42 43 44 45 46 47]
[48 49 50 51 52 53 54 55]
[56 57 58 59 60 61 62 63]]
我将矩阵分成“ block ”或子矩阵,如下所示:
[[[ 0 1]
[ 8 9]]
[[ 2 3]
[10 11]]
[[ 4 5]
[12 13]]
[[ 6 7]
[14 15]]
[[16 17]
[24 25]]
[[18 19]
[26 27]]
[[20 21]
[28 29]]
...
[[50 51]
[58 59]]
[[52 53]
[60 61]]
[[54 55]
[62 63]]]
每个 2x2 象限都是从左到右从上到下获取的。生成方式:
def view_as_blocks(arr, BSZ):
# arr is input array, BSZ is block-size
m, n = arr.shape
M, N = BSZ
return arr.reshape(m // M, M, n // N, N).swapaxes(1, 2).reshape(-1, M, N)
我想做的是使用诸如 reshape、stack/vstack/hstack/等的“numpy”方式重新构建原始矩阵。我可以使用以下方法重建矩阵:
#Full code at the bottom
block_width = 2
block_size = 4
width = 8
blocks_per_row = width // block_width
for index in range(64):
block_row = index // (block_size * blocks_per_row)
normal_index = (index - (block_row * block_size * blocks_per_row))
row = normal_index // width
col = normal_index - row * width
block_index = block_row * blocks_per_row + col // block_width
block_col = col % block_width
print(block_index, row, block_col, c[block_index][row][block_col], '=', index, c[block_index][row][block_col] == index)
似乎应该有一种方法可以将分成“ block ”的过程反转回原始矩阵,而不必遍历每个索引,但我的大脑似乎无法弄清楚。我可以执行上述操作并重新构建原始矩阵,但当您拥有更大的矩阵时,我试图留在“numpy 世界”中以提高性能。预先感谢任何人。
完整代码如下:
import numpy as np
def view_as_blocks(arr, BSZ):
# arr is input array, BSZ is block-size
m, n = arr.shape
M, N = BSZ
return arr.reshape(m // M, M, n // N, N).swapaxes(1, 2).reshape(-1, M, N)
c = np.arange(64).reshape(8, 8)
print(c)
c = view_as_blocks(c, (2, 2))
print(c)
block_width = 2
block_size = 4
width = 8
blocks_per_row = width // block_width
for index in range(64):
block_row = index // (block_size * blocks_per_row)
normal_index = (index - (block_row * block_size * blocks_per_row))
row = normal_index // width
col = normal_index - row * width
block_index = block_row * blocks_per_row + col // block_width
block_col = col % block_width
print(block_index, row, block_col, c[block_index][row][block_col], '=', index, c[block_index][row][block_col] == index)
最佳答案
不错的代码,你用这些 block 做什么?
无论如何,为此你必须知道原始形状,因为有很多方法可以重建展平的矩阵。我只是颠倒了您所做的操作顺序:
def reconstruct(arr, original_shape):
_, M, N = arr.shape
m, n = original_shape
return arr.reshape(m // M, n // N, M, N).swapaxes(1, 2).reshape(m, n)
关于Python/Numpy 分割成子矩阵后重新连接矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67117317/