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

如何在NumPy中高效实现n×1与m×1向量相乘得到n×m矩阵

高效实现n×1与m×1向量外积生成n×m矩阵

最高效实现方式

在Python的NumPy库中,有两种最高效的实现方式,均基于底层优化的C代码执行,远快于手动循环:

  • 直接使用np.outer函数:这是专门为外积场景设计的API,传入两个一维数组即可直接得到结果
    import numpy as np
    a = np.array([1, 2, 3])  # 形状(3,)
    b = np.array([4, 5])     # 形状(2,)
    result = np.outer(a, b)  # 输出形状(3,2)的矩阵
    
  • 利用广播机制手动扩展维度:将其中一个数组重塑为列向量(n×1),再与另一个一维数组相乘,NumPy会自动触发广播规则完成元素级乘法
    # 方式1:用newaxis扩展维度
    result = a[:, np.newaxis] * b
    # 方式2:用reshape重塑
    result = a.reshape(-1, 1) * b
    

两种方式性能几乎无差异,因为np.outer内部本质也是基于广播实现的优化逻辑。

背后的数学原理

你所说的“向量相乘生成n×m矩阵”,本质是向量的外积(张量积),而非得到标量的点积。具体原理:

  1. 把形状为(n,)的一维数组看作n×1的列向量$\mathbf{a} = \begin{bmatrix}a_1 \ a_2 \ \vdots \ a_n\end{bmatrix}$,形状为(m,)的数组看作m×1的列向量$\mathbf{b} = \begin{bmatrix}b_1 \ b_2 \ \vdots \ b_m\end{bmatrix}$
  2. 外积$\mathbf{a} \otimes \mathbf{b}$的定义是生成一个n×m矩阵,其中第i行第j列的元素为$a_i \times b_j$
  3. 当你把a重塑为n×1的二维数组后,NumPy会自动将b广播为1×m的行向量,此时两者的元素级乘法正好对应外积的每个元素计算——n×1的列向量每行和1×m的行向量逐元素相乘,最终得到n×m的矩阵。

举个直观的例子:

  • a = [1,2,3](列向量),b = [4,5](列向量)
  • 外积结果的第一行是$1×4, 1×5$,第二行是$2×4,2×5$,第三行是$3×4,3×5$,正好对应生成的3×2矩阵。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 18:58:23