scipy 如何将一个矩阵中的1替换为另一个子矩阵?

6tr1vspr  于 2022-11-10  发布在  其他
关注(0)|答案(2)|浏览(113)

我有一个类似矩阵的

[[1, 2],
 [3, 4]]

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

[[1, 0],
 [1, 1]]

要制作此矩阵,请执行以下操作:

[[1, 2, 0, 0],
 [3, 4, 0, 0],
 [1, 2, 1, 2],
 [3, 4, 3, 4]]

第二矩阵中的1 s可以在任何位置,这只是一个例子。
我该怎么做?

anauzrmj

anauzrmj1#

使用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]])

它是如何工作的?

它有两个维度分别为M, NP, Q的数组,这里是维度分别为2, 22, 2m2m1
接下来,它会以下列方式将数组相乘:

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

建立维度的单一数组(M*PN*Q

n6lpvg4x

n6lpvg4x2#

您可以使用一个名为Kronecker product的数学运算来优雅地实现这一点,该运算在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]])

下面是克罗内克积的数学运算:

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

相关问题