2017-12-18 166 views
1

我已经看过这个Q/A Intent of this Fotran77 code,我几乎已经将下面的Fortran77样式代码转换为Python 3.x,除非我怀疑i = i + 1应该放在Python版本。正如我在相关问题的评论中所提到的,我已经完成了一致性测试,结果的偏差为2.因此,这个问题。将Fortran 77代码转换为Python

i = 0 
500 continue 
i = i +1 
if (i .le. ni) then 
    if (u(i,j-1) .gt. -9999.) then 
    r(1,j) = u(i,j-1) 
    go to 600 
    else 
    missing = i 
    go to 500 
    end if 
end if 
600 continue 

这里是我的Python版本

i = 0 
    while (i <= ni): 
    i = i+1 
    if (u[i,j-1] > -9999.0): 
     r[0,j] = u[i,j-1] 
     break 
    else: 
     missing = i 

难道我在放在正确的位置增量计数器?

+4

Fortran从1开始的列表,如果你想要它相当于python –

+0

,它可能是0。最好的是调试/打印这两个程序的值。这只是一个现在微调的问题。但我的记忆是模糊的。你的fortran程序中是否存在循环? –

+0

是的,但j指数问题可能也存在。我的问题是“你在展示的代码中是否存在循环?”因为AFAIR的一个循环是'我在1,5'中... ... python版本有一个循环,Fortran代码似乎没有循环。 –

回答

3

不建议直接翻译,因为你失去了一些python的高效编码特性。

要在python中正确地做到这一点,您应该1)认识python的0-索引约定,2)认识到fortran是列主要的,python是主要行,所以您应该颠倒所有多维阵列。

如果你这样做循环可以写成:

try: 
r[j,0]=[val for val in u[j] if val > -9999 ][0] 
missing=False 
except: 
missing=True 

我假设,我们实际上并不需要缺失的数值。 如果你需要它,你就会有这样的事情:

try: 
missing,r[j,0]=[(index,val) for (index,val) in enumerate(u[j]) if val > -9999 ][0] 
except: 
missing=-1 

你也可以使用next这将是快,但它变得有点棘手处理丢失情况。

+0

感谢upvoted。将明天测试解决方案并接受:) – gansub

+0

我没有必要的声望来进行更改,但u是一个二维数组。你想改变吗? – gansub

+0

这就是对的。只有一个索引,例如'u [j]'表示整个第j行。 – agentp