2017-12-18 165 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