如何在NumPy中简洁实现两个结构化矩阵的特定乘法?
问题描述
我有两个矩阵:
- 第一个是4×3的结构化矩阵,结构如下:
[[1, 0, a], [0, 1, b], [1, 0, c], [0, 1, d]]
其中1、0、a、b、c、d均为标量;
2. 第二个是2×3矩阵,结构如下:
[[r1], [r2]]
其中r1、r2分别为第一、第二行,每行包含3个元素。
我希望得到4×9的输出矩阵:
[[r1, 0, a*r1], [0, r1, b*r1], [r2, 0, c*r2], [0, r2, d*r2]]
该运算类似Kronecker积,但需针对第二个矩阵的每行单独执行。我希望避免繁琐循环,如何在NumPy中简洁实现?
NumPy简洁实现方案
利用NumPy的广播机制和向量化操作可以完全避免循环,实现步骤如下:
核心思路
将第一个矩阵的每个标量元素,与第二个矩阵对应行的行向量做广播乘法,再将结果拼接展平为目标形状。
代码实现
import numpy as np # 定义示例参数与矩阵 a, b, c, d = 2, 3, 4, 5 r1 = np.array([1, 2, 3]) r2 = np.array([4, 5, 6]) A = np.array([[1, 0, a], [0, 1, b], [1, 0, c], [0, 1, d]]) R = np.array([r1, r2]) # 扩展R的行数,与矩阵A的行数匹配(从2行扩展为4行) R_expanded = np.repeat(R, 2, axis=0) # 广播乘法+形状调整得到结果 result = (A[..., np.newaxis] * R_expanded[:, np.newaxis, :]).reshape(4, 9) print(result)
代码解释
- 扩展R矩阵:用
np.repeat(R, 2, axis=0)将R从(2,3)扩展为(4,3),使得A的每一行都能对应到R的目标行(A的第0、2行对应R的第0行,第1、3行对应R的第1行)。 - 广播乘法:
A[..., np.newaxis]将A的形状从(4,3)转为(4,3,1),让每个标量元素具备可广播的维度;R_expanded[:, np.newaxis, :]将扩展后的R形状转为(4,1,3),让每一行的行向量也具备可广播的维度;- 两者相乘时,广播机制会自动让每个A的标量与对应行的R行向量完成元素级乘法,得到形状为
(4,3,3)的中间结果。
- 形状调整:用
reshape(4,9)将中间结果的每个(3,3)子矩阵展平为9元素的行向量,最终得到4×9的目标矩阵。
内容的提问来源于stack exchange,提问作者Yakov Dan
相关产品推荐
相关产品推荐

