2017-12-18 3 views
1

Ich habe mir dieses Q/A Intent of this Fotran77 code angeschaut und ich habe fast den untenstehenden Fortran77-Stil-Code in Python 3.x umgewandelt, außer ich hatte Zweifel, wo das i = i + 1 in der platziert werden sollte Python-Version. Wie in den Kommentaren der verknüpften Frage erwähnt, habe ich die Konformitätstests durchgeführt und die Ergebnisse sind mit einem Abstand von 2 aus. Daher die Frage.Converting Fortran 77 Code zu 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 

Hier ist meine Python-Version

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 

Habe ich den Zuwachs Zähler an der richtigen Stelle platzieren?

+4

Fortran beginnt bei 1 für Listen, es ist 0 für Python –

+0

, wenn Sie es wahrscheinlich gleichwertig wollen. Am besten debuggen/drucken Sie die Werte für beide Programme. Es ist nur eine Frage der Feinabstimmung jetzt. aber meine Erinnerung ist verschwommen. Gibt es in Ihrem Fortran-Programm eine Schleife? –

+0

ja, aber das Off-by-One-Index-Problem ist wahrscheinlich auch für j da. Und meine Frage war "Gibt es eine Schleife in dem Code, den du zeigst?" Weil AFAIR eine Schleife 'DO I in 1,5 'ist ... die Python-Version hat eine Schleife, der Fortran-Code scheint keine Schleife zu haben. –

Antwort

3

Direkte Übersetzung wird nicht empfohlen, weil Sie eine Reihe von netten effizienten Codierungsfunktionen von Python verlieren.

Um dies richtig in Python zu tun, sollten Sie 1) die 0-Index-Konvention von Python zu erkennen, und 2) erkennen, dass das Fortran ist Spalte Major und Python ist Zeile Haupt, so dass Sie die Indexreihenfolge für alle mehrdimensionalen umkehren sollten Arrays.

Wenn Sie das tun, dass die Schleife geschrieben werden kann:

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

Ich gehe davon aus wir tun müssen, nicht wirklich den numerischen Wert fehlt. Wenn Sie sie brauchen Sie so etwas wie diese:

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

Sie auch next verwenden könnten, das schneller sein würde, aber es wird ein wenig knifflige die fehlende Bedingung Handhabung.

+0

dankbar aufgepfropft. Will die Lösung morgen testen und akzeptieren :) – gansub

+0

Ich habe keinen notwendigen Ruf, um die Änderung zu machen, aber Sie sind ein zweidimensionales Array. Möchten Sie die Änderung vornehmen? – gansub

+0

das ist richtig. mit einem einzigen Index bezieht sich z. B. "u [j]" auf die gesamte 'j-te Zeile. – agentp

Verwandte Themen