为何Python中SIQRA模型函数调用后需加.T才能正常运行?
为什么需要用
.T来拆分odeint的返回值? 核心原因:SciPy的odeint返回数组的维度和你需要的变量结构不匹配
你用odeint求解微分方程组后,得到的ret是一个二维NumPy数组,它的形状是(时间点数量, 状态变量数量):
- 每一行对应某一个时刻
t的所有状态变量值(比如第一行是t=0时的[S,I,Q,R,A],第二行是下一个时间点的[S,I,Q,R,A],以此类推) - 举个例子,你用
np.linspace(0,10)生成了默认50个时间点,y0有5个状态变量,所以ret的形状是(50,5)
而你需要的是每个状态变量随时间变化的完整序列(比如S变量包含所有50个时间点的取值),这时候就需要用.T对数组进行转置:
- 转置后
ret.T的形状变成(5,50),每一行对应一个状态变量的全部时间序列(第一行是S的所有时间点值,第二行是I的所有时间点值,以此类推) - 这时候
S, I, Q, R, A = ret.T就能把转置后的5行分别赋值给5个变量,每个变量都是长度为50的一维数组,刚好符合后续分析/绘图的需求
如果不加.T直接写S, I, Q, R, A = ret会报错:因为ret有50行,你却只给了5个变量,Python会提示「too many values to unpack (expected 5)」,维度不匹配导致无法解包。
直观对比两种结构
转置前的ret(形状50×5):
[ [S0, I0, Q0, R0, A0], [S1, I1, Q1, R1, A1], ... [S49, I49, Q49, R49, A49] ]
转置后的ret.T(形状5×50):
[ [S0, S1, ..., S49], [I0, I1, ..., I49], [Q0, Q1, ..., Q49], [R0, R1, ..., R49], [A0, A1, ..., A49] ]
内容的提问来源于stack exchange,提问作者amdkeepsmehot
相关产品推荐
相关产品推荐

