使用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
相关产品推荐
相关产品推荐

