Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在另一个矩阵的对角线上插入一个由零组成的矩阵_Python_Numpy_Matrix - Fatal编程技术网

Python 在另一个矩阵的对角线上插入一个由零组成的矩阵

Python 在另一个矩阵的对角线上插入一个由零组成的矩阵,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的零矩阵 到目前为止我做了什么 一个简单的基于范围的循环,然后

淡化的例子

假设我有以下矩阵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的零矩阵

到目前为止我做了什么

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

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的做事方式。