NumPy中如何实现向量-矩阵-向量连乘得到结果24
NumPy实现a×b×c连乘(结果为24)的方案
前置基础定义
按照题目给出的数组初始化规则,基础对象的属性如下:
- 一维向量a:
a = np.array([1, 2]),形状为(2,),无明确行/列方向 - 二维对角矩阵b:
b = np.array([[4, 0], [0, 5]]),形状为(2, 2) - 转置向量c:
c = a.T,由于一维数组无方向属性,转置后形状仍为(2,),和原a无形状差异
常见认知误区
NumPy的一维ndarray不存在行向量、列向量的维度区分,直接执行
c = a.T不会改变c的形状。如果直接按照带维度的矩阵乘法规则(行向量×矩阵×列向量)书写代码,容易因为维度缺失导致后续批量运算时出现逻辑歧义。
可复现结果24的实现方案
方案1:显式调整维度,严格匹配矩阵乘法规则
将a调整为(1,2)的行向量形状,将c调整为(2,1)的列向量形状,完全符合矩阵乘法的维度传递规则:
import numpy as np a = np.array([1, 2]) b = np.array([[4, 0], [0, 5]]) c = a.T # 显式升维匹配矩阵运算维度 a_row = a.reshape(1, 2) c_col = c.reshape(2, 1) # 执行连乘运算 result = a_row @ b @ c_col # result值为[[24]],提取标量值即可得到目标结果24 print(result.item())
方案2:用爱因斯坦求和实现,无维度歧义
通过np.einsum直接指定下标映射逻辑,不需要手动调整数组形状,计算过程直观可控:
# 下标逻辑:a的索引i,b的i-j维度,c的j维度,缩并所有维度后得到标量 result = np.einsum('i,ij,j->', a, b, c) print(result) # 直接输出24
方案3:利用NumPy一维数组的乘法规则快速实现
由于一维数组间的@运算本质是内积,不需要调整形状即可得到正确结果:
# 计算流程:a(2,) @ b(2,2) → 长度为2的向量,再和c(2,)做内积得到标量 result = a @ b @ c print(result) # 输出24
注意:这种写法虽然结果正确,但没有显式的维度校验,一旦后续把a换成二维行/列向量,很容易出现维度不匹配的报错,适合简单脚本快速计算,不适合复杂工程场景。
内容的提问来源于stack exchange,提问作者john price
相关产品推荐
相关产品推荐

