淡化示例
考虑我有以下矩阵 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
我完全理解这是一种非常粗鲁和讨厌的方式。请建议一种快速且“麻木”的方法。
答案 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 框的左上角,大小是您想要的框有多大。