【问题标题】:Converting Fortran 77 code to Python将 Fortran 77 代码转换为 Python
【发布时间】:2017-12-19 00:15:08
【问题描述】:

我查看了此 Q/A Intent of this Fotran77 code 并且几乎将以下 Fortran77 样式代码转换为 Python 3.x,但我怀疑 i = i + 1 应该放在 Python 版本中的哪个位置。正如链接问题的 cmets 中所述,我已经完成了一致性测试,结果相差 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

我是否将增量计数器放置在正确的位置?

【问题讨论】:

  • Fortran 列表从 1 开始,python 从 0 开始
  • 如果您希望它等效,可能。最好的办法是调试/打印两个程序的值。现在只是微调的问题。但我的记忆很模糊。你的 fortran 程序中有循环吗?
  • 是的,但是 j 也可能存在非一索引问题。我的问题是“您显示的代码中是否存在循环?”因为AFAIR循环是DO I in 1,5 ... python版本有循环,fortran代码似乎没有循环。
  • Fortran 代码中没有循环。未引用语句 500。 “隐式”是什么意思?
  • @ShpielMeister - 你是绝对正确的!我进行了编辑。

标签: python fortran fortran77


【解决方案1】:

不建议直接翻译,因为您失去了 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,这会更快,但处理缺失条件会有点棘手。

【讨论】:

  • 没错。使用单个索引,例如 u[j] 指的是整个 jth 行。
猜你喜欢
  • 2023-03-27
  • 1970-01-01
  • 2014-11-05
  • 1970-01-01
  • 1970-01-01
  • 2015-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多