numpy广播错误:无法将(3,3)数组广播至(3,)的问题排查
问题原因与解决办法
报错根源
你定义的常数向量是**(3,1)的二维数组**(内层额外添加了方括号),但np.dot(3×3矩阵, s)返回的是**(3,)的一维数组**——solve_ivp传入的s是一维数组,矩阵与一维数组的点积结果也为一维。两者形状不兼容,numpy尝试广播时就会抛出“无法从(3,3)广播到(3,)”的错误。
修复方案
只需把常数向量改成一维数组(去掉内层的方括号),让它和点积结果形状一致即可:
F = lambda t, s: np.array([-6.75e-6, 1.68e-6, -5.85e-6]) - np.dot(np.array([[0.0303,0,0],[0,1.4666,0],[0,0,0.4078]]), s)
更简洁的写法(推荐)
提前定义矩阵和常数向量,避免重复创建数组,代码可读性更高:
import matplotlib.pyplot as plt import numpy as np from scipy.integrate import solve_ivp # 提前定义矩阵和常数向量 A = np.array([[0.0303,0,0],[0,1.4666,0],[0,0,0.4078]]) b = np.array([-6.75e-6, 1.68e-6, -5.85e-6]) # 使用@运算符代替np.dot,语法更直观 F = lambda t, s: b - A @ s sol = solve_ivp(F, [1, 33], [1,1,1])
修改后,b是(3,)的一维数组,A @ s返回的也是(3,)数组,减法操作可正常执行,不会再出现形状不匹配的问题。
内容的提问来源于stack exchange,提问作者Carl
相关产品推荐
相关产品推荐

