在另一个矩阵的对角线上插入一个零矩阵

时间:2021-01-22 14:08:26

标签: python numpy matrix

淡化示例

考虑我有以下矩阵 A,

1  2  4  3
1  7  3  6
2  4  1  1
6  9  3  6

我想把它转换成矩阵 B 看起来像,

0  0  4  4
0  0  3  6
2  4  0  0
6  9  0  0

所以基本上我想要,假设在上面给出的 4x4 矩阵的对角线上有一个 2x2 的零矩阵。

需要一个通用的解决方案

我上面提供的只是一个例子,我将使用 (1296, 1296) 大小的矩阵作为输入,我想在其对角线内插入一个 3x3 零矩阵。

到目前为止我做了什么?

一个简单的基于范围的循环,然后像这样将值设置为零,

for i in range(0, mat.shape[0] - 1, 3):
    mat[i][i] = 0
    mat[i][i + 1] = 0
    mat[i][i + 2] = 0
    mat[i + 1][i] = 0
    mat[i + 1][i + 1] = 0
    mat[i + 1][i + 2] = 0
    mat[i + 2][i] = 0
    mat[i + 2][i + 1] = 0
    mat[i + 2][i + 2] = 0

我完全理解这是一种非常粗鲁和讨厌的方式。请建议一种快速且“麻木”的方法。

3 个答案:

答案 0 :(得分:2)

你可以尝试这样的事情:

start=0
stop=1296
step=3
for i in np.arange(start=start, stop=stop, step=step):
    mat[i:i+step, i:i+step] = 0

答案 1 :(得分:1)

这是一个无循环的解决方案:

mat = np.ones((12,12))
np.einsum('ijik->ijk',mat.reshape((4,3,4,3)))[...] = 0
mat
# array([[0., 0., 0., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
#        [0., 0., 0., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
#        [0., 0., 0., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
#        [1., 1., 1., 0., 0., 0., 1., 1., 1., 1., 1., 1.],
#        [1., 1., 1., 0., 0., 0., 1., 1., 1., 1., 1., 1.],
#        [1., 1., 1., 0., 0., 0., 1., 1., 1., 1., 1., 1.],
#        [1., 1., 1., 1., 1., 1., 0., 0., 0., 1., 1., 1.],
#        [1., 1., 1., 1., 1., 1., 0., 0., 0., 1., 1., 1.],
#        [1., 1., 1., 1., 1., 1., 0., 0., 0., 1., 1., 1.],
#        [1., 1., 1., 1., 1., 1., 1., 1., 1., 0., 0., 0.],
#        [1., 1., 1., 1., 1., 1., 1., 1., 1., 0., 0., 0.],
#        [1., 1., 1., 1., 1., 1., 1., 1., 1., 0., 0., 0.]])

答案 2 :(得分:0)

这应该可以解决它:

your_matrix = [
    [1, 2, 4, 3],
    [1, 7, 3, 6],
    [2, 4, 1, 1],
    [6, 9, 3, 6]
]

def calculate(matrix, x, y, size):
    for index, x_row in enumerate(matrix):
        for add in range(size):
            if index == y+add:
                for add_2 in range(size):
                    x_row[x+add_2] = 0

    return matrix


your_matrix = calculate(matrix=your_matrix, x=1, y=1, size=2)
print(your_matrix)

x、y 位于 0 框的左上角,大小是您想要的框有多大。