Python循环递推计算numpy数组Pe、v时输出与预期不符的解决方法
递推迭代代码结果偏差排查
问题描述
实现依赖上一步计算结果迭代生成数组Pe和v的递推算法时,代码运行输出和预期结果存在偏差。
已知信息
算法规则
# t=1步计算 Pe[1] = Pe[0] * v[0] * Δt # 步长Δt固定为1 v[1] = Pe[1] * 4 # t=2步计算 Pe[2] = Pe[1] * v[1] * Δt # 步长Δt固定为1 v[2] = Pe[2] * 4
注:原规则写法中
t(=1)、t(=2)为当前计算步的序号说明,不是公式中需要代入的变量乘数。
原始实现代码
import numpy as np arPe=[] arv=[] for t in range(0,3): if t == 0: Pe=np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) v=2 arPe.append(Pe) arv.append(v) IPe=np.array(arPe) Iv=np.array(arv) else: Pe=Pe*v*t v=Pe*4 arPe.append(Pe) arv.append(v) IPe=np.array(arPe) Iv=np.array(arv) print("IPe =",[IPe]) print("Iv =",[Iv]) print("IPe shape =",IPe.shape) print("Iv shape =",Iv.shape)
错误表现
t=2步的Pe和v所有值为预期值的2倍,例如Pe[2][0][0]输出32,预期为16;v[2][0][0]输出128,预期为64。
错误根因
递推计算Pe时,错误将循环变量t(当前迭代步的序号)作为乘数代入计算:
- t=1时,乘以1不会改变计算结果,因此第一步输出符合预期
- t=2时,乘以2导致所有计算结果放大为预期值的2倍,和预期输出偏差
另外代码中每次循环都重复将列表转为numpy数组属于冗余操作,不影响结果但会产生不必要的性能消耗。
修正方案
- 删除
Pe计算式中多余的*t乘数,步长固定为1,乘1不改变结果可直接省略 - 将numpy数组转换操作移到循环结束后执行,减少冗余计算,转
Iv时指定dtype=object兼容标量和数组混合存储的场景
修正后代码
import numpy as np arPe = [] arv = [] for t in range(0, 3): if t == 0: Pe = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) v = 2 else: Pe = Pe * v v = Pe * 4 arPe.append(Pe) arv.append(v) IPe = np.array(arPe) Iv = np.array(arv, dtype=object) print("IPe =", [IPe]) print("Iv =", [Iv]) print("IPe shape =", IPe.shape) print("Iv shape =", Iv.shape)
验证结果
修正后代码输出和预期完全一致:
- t=2步
Pe首元素为16,v首元素为64,所有矩阵值匹配预期 - 输出shape保持
(3,3,3)和(3,)符合要求
内容的提问来源于stack exchange,提问作者Wiz123
相关产品推荐
相关产品推荐

