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

使用Numpy将两个3×3矩阵运算生成3×3×3张量的方法求教

问题分析

你需要的计算逻辑是对每个样本、每个输入神经元、每个输出神经元,取对应样本的输入神经元值乘以对应输入到输出的权重,输出张量三个维度分别对应:[样本索引, 输入神经元索引, 输出神经元索引]。
注:你给出的预期输出中有少量笔误,比如最后一个维度的第二、第三列部分位置误用了a2的标识,实际逻辑应为对应输入神经元的值,不影响计算方法实现。

实现方法

方法1:广播机制实现(最简单)

直接给in_a新增最后一个维度后和in_w相乘即可,Numpy会自动触发广播匹配维度:

import numpy as np

# 示例输入
in_a = np.array([['t_1a_1', 't_1a_2', 't_1a_3'],
                 ['t_2a_1', 't_2a_2', 't_2a_3'],
                 ['t_3a_1', 't_3a_2', 't_3a_3']], dtype='<U6')
in_w = np.array([['w_11', 'w_12', 'w_13'],
                 ['w_21', 'w_22', 'w_23'],
                 ['w_31', 'w_32', 'w_33']], dtype='<U4')

# 字符串拼接场景(对应你的示例)
out = in_a[..., np.newaxis] + '*' + in_w
# 实际数值张量场景直接用以下代码即可
# out = in_a[..., np.newaxis] * in_w

解释:in_a[..., np.newaxis]会把形状从(3,3)变成(3,3,1),和形状为(3,3)的in_w运算时,Numpy会自动把in_w扩展为(1,3,3),广播后逐元素运算得到(3,3,3)的输出,完全符合你的要求。

方法2:einsum实现(可读性最高)

用numpy.einsum可以直接显式指定维度的对应关系,不需要考虑广播规则:

# 字符串拼接场景(对应你的示例)
out = np.einsum('ij,jk->ijk', in_a, np.char.add('*', in_w))
# 实际数值张量场景直接用以下代码即可
# out = np.einsum('ij,jk->ijk', in_a, in_w)

解释:einsum的表达式中:

  • ij对应in_a的两个维度:i是样本索引,j是输入神经元索引
  • jk对应in_w的两个维度:j是输入神经元索引,k是输出神经元索引
  • ->ijk指定输出的三个维度顺序,自动对应每个位置做a[i,j] * w[j,k]的运算

内容的提问来源于stack exchange,提问作者Phönix 64

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 01:45:00