python fortran混合编程输入矩阵_将fortran翻译成python:用于从文本fi生成矩阵的等价命令...

首先,Fortranequivalence和内存布局。我们需要先看看内存布局。为了简单起见,我将描述二维情况。对于任意维,一般化不应该太难理解。在

fortran数组总是一个连续的内存块1。最左边的索引变化最快(称为列主顺序)。所以:a(i, j)

a(i+1, j)

几乎总是。在某些情况下,数组切片和F90+指针可能会使该语句不真实。即使这样,这些“数组”也由分配给程序的连续内存块来支持…

在内存中是相邻的。现在,假设我们有一个用长度a(N, M)声明的数组。从内存的角度来看,这与数组a(N*M)没有什么不同,其中索引的映射是:

^{pr2}$

(N-1是因为fortran在索引中默认为基于1)。在

最终,当您有一个2D数组时,编译器将您的语句a(i, j)转换为a(i*(N-1) + j)。它可能也会进行一些边界检查(例如,确保i在1和{}之间,但通常必须用编译器标志打开它,因为它会轻微影响性能,而且Fortran群众确实不喜欢它在程序减速时;-)。在

好吧,我们在哪?对于编译器来说,N维数组实际上只是一个带有索引重新映射的一维数组。

现在我们可以开始处理equivalence。C中类似的构造是指针。等价语句表示ping中的第一个元素与pg中的第一个元素是相同的内存位置。这允许用户将数据读入ping,这是一个平面数组,但是让它填充n维数组(因为最终,它们共享相同的内存位置)。值得注意的是,现代Fortran有指针。它们并不完全像C指针,但我认为大多数Fortran爱好者会建议您在新代码中使用它们,而不是等效的。在

现在,我如何在python中读取这些数据?我可能会做一些简单的事情:def yield_values(filename):

with open(filename) as f_input:

for line in f_input:

for val in line.split(','):

yield float(val)

然后你可以把它打包成一个numpy数组:import numpy as np

arr = np.array(list(yield_values('data.dat')))

最后,可以重塑阵列的形状:# Account for python's Row-major ordering.

arr = arr.reshape((NTAUg, NTg, NDg, NSIZ))

如果您更喜欢fortran的列主顺序:arr = arr.reshape((NSIZ, NDg, NTg, NTAUg), order='F')

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值