You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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数组属于冗余操作,不影响结果但会产生不必要的性能消耗。

修正方案

  1. 删除Pe计算式中多余的*t乘数,步长固定为1,乘1不改变结果可直接省略
  2. 将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 08:57:20