You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在NumPy中简洁实现两个结构化矩阵的特定乘法?

问题描述

我有两个矩阵:

  1. 第一个是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)

代码解释

  1. 扩展R矩阵:用np.repeat(R, 2, axis=0)将R从(2,3)扩展为(4,3),使得A的每一行都能对应到R的目标行(A的第0、2行对应R的第0行,第1、3行对应R的第1行)。
  2. 广播乘法:
    • A[..., np.newaxis] 将A的形状从(4,3)转为(4,3,1),让每个标量元素具备可广播的维度;
    • R_expanded[:, np.newaxis, :] 将扩展后的R形状转为(4,1,3),让每一行的行向量也具备可广播的维度;
    • 两者相乘时,广播机制会自动让每个A的标量与对应行的R行向量完成元素级乘法,得到形状为(4,3,3)的中间结果。
  3. 形状调整:用reshape(4,9)将中间结果的每个(3,3)子矩阵展平为9元素的行向量,最终得到4×9的目标矩阵。

内容的提问来源于stack exchange,提问作者Yakov Dan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 14:01:02