Python 在另一个矩阵的对角线上插入一个由零组成的矩阵
淡化的例子 假设我有以下矩阵APython 在另一个矩阵的对角线上插入一个由零组成的矩阵,python,numpy,matrix,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 基本上,我想要一个2x2的零矩阵,在上面给出的4x4矩阵的对角线上 需要一个普遍的解决办法 我上面提供的只是一个例子,我将使用12961296大小的矩阵作为输入,我想在其对角线内插入一个3x3的零矩阵 到目前为止我做了什么 一个简单的基于范围的循环,然后
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
基本上,我想要一个2x2的零矩阵,在上面给出的4x4矩阵的对角线上
需要一个普遍的解决办法
我上面提供的只是一个例子,我将使用12961296大小的矩阵作为输入,我想在其对角线内插入一个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
我完全理解,这是一种非常粗鲁和肮脏的方式。请建议一种快速、简便的方法。您可以尝试以下方法:
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
您可以尝试以下方法:
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, 2, 4, 3],
[1, 7, 3, 6],
[2, 4, 1, 1],
[6, 9, 3, 6]
]
def计算器矩阵x、x、y、大小:
对于索引,枚举矩阵中的x_行:
对于外接程序rangesize:
如果索引==y+添加:
对于在rangesize中添加_2:
x_行[x+添加_2]=0
返回矩阵
你的_矩阵=计算矩阵x=你的_矩阵,x=1,y=1,size=2
打印你的矩阵
x,y在0框的左上角,大小是您想要的框的大小。这应该可以解决它:
您的_矩阵=[
[1, 2, 4, 3],
[1, 7, 3, 6],
[2, 4, 1, 1],
[6, 9, 3, 6]
]
def计算器矩阵x、x、y、大小:
对于索引,枚举矩阵中的x_行:
对于外接程序rangesize:
如果索引==y+添加:
对于在rangesize中添加_2:
x_行[x+添加_2]=0
返回矩阵
你的_矩阵=计算矩阵x=你的_矩阵,x=1,y=1,size=2
打印你的矩阵
x,y位于0框的左上角,大小是您想要的框的大小。这里有一个无循环的解决方案:
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.]])
以下是一个无循环的解决方案:
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.]])
哇,这看起来很干净。谢谢我会试试这个。只是想知道,用range代替np.arange不是一个更好的解决方案吗@SJ11很有魅力。很高兴听到这个。哦,是的,范围可能是一个更好的选择,因为你并不真的需要一个numpy阵列。哇,这看起来很干净。谢谢我会试试这个。只是想知道,用range代替np.arange不是一个更好的解决方案吗@SJ11很有魅力。很高兴听到这个。哦,是的,范围可能是一个更好的选择,因为你并不真的需要numpy数组。谢谢你的回答,但我真的不认为这是一个numpy的做事方式。谢谢你的回答,但我真的不认为这是一个numpy的做事方式。