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

如何在NumPy中将二维数组行平方转换为三维数组?

高效实现矩阵行的外积运算(用于Softmax导数批量计算)

核心需求

给定形状为(n_samples, d)的二维NumPy矩阵,对每一行计算外积(即row.reshape(-1, 1) @ row.T),得到形状为(n_samples, d, d)的三维数组,避免低效的Python循环。

解决方案1:利用NumPy广播机制

通过维度扩展实现广播相乘,直接得到批量外积结果:

import numpy as np

a = np.array([[1,2,3],
              [4,5,6]])

# 扩展维度后广播相乘
outer_product = a[:, :, np.newaxis] * a[:, np.newaxis, :]
print(outer_product)

输出结果:

array([[[ 1,  2,  3],
        [ 2,  4,  6],
        [ 3,  6,  9]],

       [[16, 20, 24],
        [20, 25, 30],
        [24, 30, 36]]])

原理说明:

  • a[:, :, np.newaxis]将原数组从(2,3)转换为(2,3,1)
  • a[:, np.newaxis, :]将原数组转换为(2,1,3)
  • NumPy广播机制会自动扩展维度,对应位置元素相乘,最终得到每行的外积结果,与row.reshape(-1,1) @ row.T完全等价。

解决方案2:使用np.einsum(更简洁)

利用爱因斯坦求和约定,代码更直观:

outer_product = np.einsum('ni,nj->nij', a, a)

该方式同样会生成(n_samples, d, d)的三维数组,结果与广播方法一致,且底层优化效率很高。

结合Softmax导数批量实现

结合你已实现的对角三维数组构造方法,可直接完成批量Softmax导数计算:

def batch_softmax_derivative(s_matrix):
    d = s_matrix.shape[-1]
    identity = np.eye(d)
    # 构造批量对角矩阵
    diag_part = s_matrix[..., np.newaxis] * identity
    # 计算批量外积
    outer_product = s_matrix[:, :, np.newaxis] * s_matrix[:, np.newaxis, :]
    # 返回Softmax导数:diag(s) - s@s.T
    return diag_part - outer_product

其中s_matrix是批量的Softmax输出(形状(n_samples, d)),函数返回每个样本的Softmax导数矩阵(形状(n_samples, d, d))。

效率对比

上述两种方法均基于NumPy底层C优化实现,相比Python循环遍历每行的方式,在样本量较大时性能提升显著,是处理批量矩阵运算的最优选择。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 18:56:01