如何用另一个子矩阵替换一个矩阵中的 1?

Tom*_*ean 3 python numpy matrix linear-algebra scipy

我有一个类似矩阵的

[[1, 2],
 [3, 4]]
Run Code Online (Sandbox Code Playgroud)

我想替换另一个矩阵中的 1:

[[1, 0],
 [1, 1]]
Run Code Online (Sandbox Code Playgroud)

制作这个矩阵:

[[1, 2, 0, 0],
 [3, 4, 0, 0],
 [1, 2, 1, 2],
 [3, 4, 3, 4]]
Run Code Online (Sandbox Code Playgroud)

第二个矩阵中的s1可以在任何位置,这只是一个例子。

我怎样才能做到这一点?

Tom*_*ean 6

使用scipy.linalg.kron

from scipy.linalg import kron

m1 = np.array([[1, 2],[3, 4]])
m2 = np.array([[1, 0], [1, 1]])

output:
kron(m2, m1)
array([[1, 2, 0, 0],
       [3, 4, 0, 0],
       [1, 2, 1, 2],
       [3, 4, 3, 4]])
Run Code Online (Sandbox Code Playgroud)

它是如何工作的?

它需要两个维度为M, N和 的P, Q数组。这里,m2还有m12, 2尺寸2, 2

接下来,它按以下方式将数组相乘:

m2[0,0]*m1    m2[0,1]*m1  ... m2[0,-1]*m1
m2[1,0]*m1    m2[1,1]*m1  ... m2[1,-1]*m1
        ...
m2[-1,0]*m1   m2[-1,1]*m1 ... m2[-1,-1]*m1
Run Code Online (Sandbox Code Playgroud)

创建维度为 ( M*P, N*Q)的单个数组

  • 如果有人能解释“kron”在幕后是如何工作的,我会很感兴趣:) (2认同)

Mic*_*ner 6

您可以使用称为克罗内克积的数学运算来优雅地做到这一点,该运算在numpy(或在下面scipy使用numpy)中实现。

import numpy as np # or from scipy import linealg
a = np.array([[1, 0], 
              [1, 1]])
b = np.array([[1, 2], 
              [3, 4]])
np.kron(a, b) # or linealg.kron(a, b)
# returns
# array([[1, 2, 0, 0],
#        [3, 4, 0, 0],
#        [1, 2, 1, 2],
#        [3, 4, 3, 4]])
Run Code Online (Sandbox Code Playgroud)

以下是克罗内克乘积在数学上的作用:

在此输入图像描述

换句话说,通过矩阵A(或numpy数组a),我们指示是否应添加 B 的条目(如果为 1)或不添加(如果为 0)。