【问题标题】:Reordering block matrix重新排序块矩阵
【发布时间】:2021-02-13 04:34:00
【问题描述】:

我有一个多级索引方阵,需要重新排序。 假设我有一个两级索引系统xy,方阵M 的形状为(len(x)*len(y), len(x)*len(y))Mx 索引排序,我想将其转换为按y 索引排序。这是构造任意方阵M的示例:

import numpy as np
nx = 4  # equal to len(x), arbitary
ny = 3  # equal to len(y), arbitary
A=np.ones(ny*ny).reshape(ny,ny) #arbitary
B=np.ones(ny*ny).reshape(ny,ny)*2 #arbitary
C=np.ones(ny*ny).reshape(ny,ny)*3 #arbitary
D=np.ones(ny*ny).reshape(ny,ny)*4 #arbitary
E=np.arange(ny*ny).reshape(ny,ny) #arbitary
M = np.block([[A, np.zeros((ny,ny)), E, np.zeros((ny,ny))],
              [np.zeros((ny,ny)), B, np.zeros((ny,ny)),np.zeros((ny,ny))], 
              [np.zeros((ny,ny)),np.zeros((ny,ny)),C, np.zeros((ny,ny))],
              [np.zeros((ny,ny)), np.zeros((ny,ny)), np.zeros((ny,ny)), D]])

得到的矩阵 M 可能如下所示

array([[1., 1., 1., 0., 0., 0., 0., 1., 2., 0., 0., 0.],
       [1., 1., 1., 0., 0., 0., 3., 4., 5., 0., 0., 0.],
       [1., 1., 1., 0., 0., 0., 6., 7., 8., 0., 0., 0.],
       [0., 0., 0., 2., 2., 2., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 2., 2., 2., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 2., 2., 2., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 3., 3., 3., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 3., 3., 3., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 3., 3., 3., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 4., 4., 4.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 4., 4., 4.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 4., 4., 4.]])

现在我想将M 转换成M_transformed,看起来像这样

array([[1., 0., 0., 0., 1., 0., 1., 0., 1., 0., 2., 0.],
       [0., 2., 0., 0., 0., 2., 0., 0., 0., 2., 0., 0.],
       [0., 0., 3., 0., 0., 0., 3., 0., 0., 0., 3., 0.],
       [0., 0., 0., 4., 0., 0., 0., 4., 0., 0., 0., 4.],
       [1., 0., 3., 0., 1., 0., 4., 0., 1., 0., 5., 0.],
       [0., 2., 0., 0., 0., 2., 0., 0., 0., 2., 0., 0.],
       [0., 0., 3., 0., 0., 0., 3., 0., 0., 0., 3., 0.],
       [0., 0., 0., 4., 0., 0., 0., 4., 0., 0., 0., 4.],
       [1., 0., 6., 0., 1., 0., 7., 0., 1., 0., 8., 0.],
       [0., 2., 0., 0., 0., 2., 0., 0., 0., 2., 0., 0.],
       [0., 0., 3., 0., 0., 0., 3., 0., 0., 0., 3., 0.],
       [0., 0., 0., 4., 0., 0., 0., 4., 0., 0., 0., 4.]])

我使用了一个非常基本的 4 层 for 循环来解决这个问题,我相信必须有一个更直接的方法(如库)来解决这个问题,因为矩阵 M 可以变得非常大,具体取决于关于xy的长度(nxny

M_transformed = np.zeros(M.shape)

for i in range(nx):
    for j in range(nx):
        for k in range(ny):
            for l in range(ny):
                M_transformed[k * nx + i,l * nx + j] = M[i * ny + k, j * ny + l]

【问题讨论】:

  • 我没有尝试遵循您的所有逻辑,但是坚持使用这样的二维数组可能会使事情变得比需要的更难。如果数组是 4d,可以被认为是 2d 块的 2d 数组,则重新排序子块更容易。对于某些重新排序,可能需要转置(或轴交换)。

标签: python numpy matrix multi-index


【解决方案1】:

我没有进行任何计算,只是借鉴了how to do maxpooling 的一些想法,并在交换轴方面进行了很多实验。

我想出了这个计划:

这是我的解决方案:

w = (3, 3)
initial_shape = M.shape
M = M.reshape((M.shape[0]//w[0], w[0], M.shape[1]//w[1], w[1]))
M = M.swapaxes(0, 1)
M = M.swapaxes(2, 3)
M = M.reshape(initial_shape)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多