首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python,使用列表或数组进行复杂循环计算。

Python,使用列表或数组进行复杂循环计算。
EN

Stack Overflow用户
提问于 2014-01-27 12:14:24
回答 1查看 231关注 0票数 0

我正在将旧的伪Fortran代码转换为python,并且正在努力创建一个框架,以便在其中执行一些复杂的迭代计算。

作为初学者,我的第一本能是使用列表,因为我发现它们更容易使用,但是我知道数组可能是一种更合适的方法。

我已经有了所有的输入通道作为列表,我希望有一个很好的解释如何设置循环为这样的计算。

这是我正在复制的伪Fortran的一个例子。每个(t)指示一个“时间序列频道”,我目前已存储为列表(即。ECART2(t)和NNNN(t)是列表)所有的列表都有相同的条目数。

代码语言:javascript
复制
do while ( ecart2(t) > 0.0002 .and. nnnn(t) < 2000. ) ;
    mmm(t)=nnnn(t)+1.;
    if YRPVBPO(t).ge.0.1 .and. YRPVBPO(t).le.0.999930338 .and. YAEVBPO(t).ge.0.000015 .and. YAEVBPO(t).le.0.000615 then do;
        YM5(t) = customFunction(YRPVBPO,YAEVBPO);*
    end;
    YUEVBO(t) = YU0VBO(t) * YM5(t) ;*m/s
    YHEVBO(t) = YCPEVBO(t)*TPO_TGETO1(t)+0.5*YUEVBO(t)*YUEVBO(t);*J/kg
    YAVBO(t) = ddnn2(t)*(YUEVBO(t)**2);*
    YDVBO(t) = YCPEVBO(t)**2 + 4*YHEVBO(t)*YAVBO(t) ;*
    YTSVBPO(t) = (sqrt(YDVBO(t))-YCPEVBO(t))/2./YAVBO(t);*K
    YUSVBO(t) = ddnn(t)*YUEVBO(t)*YTSVBPO(t);*m/s
    YM7(t) = YUSVBO(t)/YU0VBO(t);*
    YPHSVBPOtot(t) = (YPHEVBPO(t) - YPDHVBPO(t))/(1.+((YGAMAEVBO(t)-1)/2)*(YM7(t)**2))**(YGAMAEVBO(t)/(1-YGAMAEVBO(t)));*bar
    YPHEVBPOtot(t) = YPHEVBPO(t) / (1.+rss0(t)*YM5(t)*YM5(t))**rss1(t);*bar
    YDPVBPOtot(t) = YPHEVBPOtot(t) - YPHSVBPOtot(t) ;*bar
    iter(t) = (YPHEVBPOtot(t) - YDPVBPOtot(t))/YPHEVBPOtot(t);*
    ecart2(t)= ABS(iter(t)-YRPVBPO(t));*
    aa(t)=YRPVBPO(t)+0.0001;
    YRPVBPO(t)=aa(t);*
    nnnn(t)=mmm(t);*
end;

理解伪fortran:使用“时间序列数据”,有一个impicit循环遍历每个列表中的单个值,并遍历每个值直到满足条件。

它将对第一个列表值执行循环计算,直到满足条件为止。然后,它移动到列表中的第二个值,并执行相同的循环计算,直到满足条件。

代码语言:javascript
复制
ECART2 = [2,0,3,5,3,4]
NNNN = [6,7,5,8,6,7]
do while ( ecart2(t) > 0.0002 .and. nnnn(t) < 2000. )
    MMM = NNNN + 1

这将查看每个列表中的第一个值(2和6)。由于满足这些条件,随后对新列表中的第一个值执行计算,例如MMM = 6+1,.

一旦执行了其余的计算(循环多次,如果条件不满足),那么每个列表中的第二个值才会得到考虑。第二个值(0和7)不符合条件,因此MMM的第二个条目是0。

MMM=6+1,0.

因为如果没有满足条件,则必须输入0,因此我正在考虑预先设置所有的“新列表”,并将其填充为0。

注:'customFunction()‘是一个单独的函数,它被调用,从两个输入值返回一个值

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-27 13:37:59

我目前的解决方案

设置所有空列表

代码语言:javascript
复制
nPts = range(ECART2)
MMM = [0]*nPts
YM5 = [0]*nPts
etc...

然后开始执行计算

代码语言:javascript
复制
for i in ECART2:

    while (ECART2[i] > 0.0002) and (NNNN[i] < 2000):
        MMM[i] = NNNN[i]+1

        if YRPVBPO[i]>=0.1 and YRPVBPO[i]<=0.999930338 and YAEVBPO[i]>=0.000015 and YAEVBPO[i]<=0.000615:
            YM5[i] = MACH_LBP_DIA30(YRPVBPO[i],YAEVBPO[i])

        YUEVBO[i] = YU0VBO[i]*YM5[i]
        YHEVBO[i] = YCPEVBO[i]*TGETO1[i] + 0.5*YUEVBO[i]^2
        YAVBO[i] = DDNN2[i]*YUEVBO[i]^2
        YDVBO[i] = YCPEVBO[i]^2 + 4*YHEVBO[i]*YAVBO[i]
        etc etc...

但我猜想有更好的方法来做到这一点,比如建议使用numpy数组(我计划在不久的将来学习)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21380617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档