Numpy matmul核心维度不匹配:2x2矩阵与含linspace的2x1矩阵相乘报错
错误根因
你触发维度报错的核心原因是数组维度排布不符合numpy矩阵乘法的广播规则:
- 你构造的
C数组实际维度为(2, 1, 10),10组参数的批量维度放在了最后一位 - 常量矩阵
L乘以含z的A矩阵得到的B,维度为(2, 2, 10) np.matmul默认将输入的最后两个维度识别为矩阵的行、列维度,前面的维度视为广播维度,两个输入的核心矩阵维度(2,2)和(1,10)不匹配,因此触发报错。
解决方案
方案1:使用numpy向量化广播逻辑(推荐)
调整数组维度,将10组参数的批量维度放在最前,无需使用object类型,运算效率更高:
import numpy as np # 替换为你实际的起止值和常量矩阵L initial = 0 final = 1 L = np.array([[1, 2], [3, 4]]) # 替换为你实际的L矩阵取值 # 生成参数序列 z = np.linspace(initial, final, 10) g = np.linspace(initial, final, 10) y = np.linspace(initial, final, 10) # 构造带批量维度的矩阵:shape为(批量数, 行数, 列数) A = np.stack([np.ones_like(z), z, np.zeros_like(z), np.ones_like(z)], axis=1).reshape(-1, 2, 2) B = L @ A # 输出shape为(10, 2, 2),对应10组参数的2x2矩阵 C = np.stack([y, g], axis=1).reshape(-1, 2, 1) # 输出shape为(10, 2, 1) # 批量矩阵乘法,得到10组参数对应的2x1结果 D = B @ C # 若要简化维度可执行D = D.squeeze(),得到shape为(10, 2)的数组,每行对应一组结果
如果你的需求是求解方程B @ [y; g] = 目标值,可以直接用numpy内置的线性求解方法:
# target为你指定的目标值,shape需要和B匹配,即(10, 2, 1) target = np.array([[1],[1]] * 10).reshape(-1, 2, 1) sol = np.linalg.solve(B, target) # sol的shape为(10, 2, 1),每组的第一个元素是y的解,第二个是g的解
方案2:保留object dtype写法
如果你一定要沿用现有object数组的构造方式,可以对每组参数循环计算:
D = np.array([B[..., i] @ C[..., i] for i in range(10)])
内容的提问来源于stack exchange,提问作者Christofer Iacovou
相关产品推荐
相关产品推荐

