Python/Numpy 分割成子矩阵后重新连接矩阵

标签 python numpy matrix

我有一个 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/

相关文章:

python - 根据 Pandas 中的约束生成列

c - 使用指针找到矩阵的鞍点

具有 "@"(矩阵乘法)的对象的 Python 类型提示

python - 我已经安装了 scikit-learn/sklearn。运行python文件后出现此错误

python - 尝试通过选择特定数据在 Python 中创建 3D 矩阵

algorithm - 有效地构造一个方阵,每行都有唯一的数字

c - 如何在 C 中使用动态矩阵

python selenium 数据样式名称

python - 检查字符串末尾是否包含子字符串

python - 意外的小数位数和语法查询