将 Fortran 77 代码转换为 Python
Converting Fortran 77 code to Python
我看过这个 Q/A 并且我几乎已经将下面的 Fortran77 样式代码转换为 Python 3.x 除了我怀疑 i = i + 1 应该放在 Python 版本中。正如链接问题的评论中提到的,我已经完成了一致性测试,结果相差 2。因此出现了这个问题。
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
我是否将增量计数器放置在正确的位置?
不建议直接翻译,因为您失去了 python 的许多高效编码功能。
要在 python 中正确执行此操作,您应该 1) 识别 python 的 0-索引约定,以及 2) 识别 fortran 是主要列而 python 是行major 所以你应该反转所有多维数组的索引顺序。
如果这样做,循环可以写成:
try:
r[j,0]=[val for val in u[j] if val > -9999 ][0]
missing=False
except:
missing=True
我假设我们实际上不需要 missing 的数值。
如果你需要它,你会有这样的东西:
try:
missing,r[j,0]=[(index,val) for (index,val) in enumerate(u[j]) if val > -9999 ][0]
except:
missing=-1
您也可以使用 next
,这样会更快,但处理缺失的条件会有点棘手。
我看过这个 Q/A
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
我是否将增量计数器放置在正确的位置?
不建议直接翻译,因为您失去了 python 的许多高效编码功能。
要在 python 中正确执行此操作,您应该 1) 识别 python 的 0-索引约定,以及 2) 识别 fortran 是主要列而 python 是行major 所以你应该反转所有多维数组的索引顺序。
如果这样做,循环可以写成:
try:
r[j,0]=[val for val in u[j] if val > -9999 ][0]
missing=False
except:
missing=True
我假设我们实际上不需要 missing 的数值。 如果你需要它,你会有这样的东西:
try:
missing,r[j,0]=[(index,val) for (index,val) in enumerate(u[j]) if val > -9999 ][0]
except:
missing=-1
您也可以使用 next
,这样会更快,但处理缺失的条件会有点棘手。