用numpy读/写fortran命令数组的正确方法

时间:2013-07-22 19:59:17

标签: python arrays numpy

我正在编写一个应用程序,它读取带有fortran排序数组的ascii文件,修改值,然后在ascii中将数据写回(以fortran顺序)。将这个数组读入numpy的正确方法是什么,表示该数组是fortran顺序, 然后以fortran顺序将数据写回来?

假设我有一个包含以下ascii文本的文件:

0.0 1.0 2.0 3.0 4.0 5.0 6.0 7.0

这些数字代表以fortran顺序编写的2x2x2数组。

ascii格式比上面复杂一点。但是,足以说格式不适合使用numpy.loadtxt等任何自动numpy ascii加载器。

我正在执行类似于以下内容的行来创建数组:

x = numpy.array([0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0], order='F')

我知道这是无效的,并且会进行大量额外的数据复制等。但我更担心订购。

所以,在这一点上,我认为x在内存中就像fortran数组一样排序。现在,当我导出此数组时,我应该使用numpy.nditer(x, order='F')吗?

2 个答案:

答案 0 :(得分:0)

请考虑以下事项:

In [11]: x = numpy.array([0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0])

In [12]: xf = x.reshape((2, 2, 2), order='F')

此处xf是对2x2x2的{​​{1}} Fortran排序视图。您可以对其进行修改,x也会相应更改:

x

导出In [22]: xf[0,:,1] = [11, 12] In [23]: x Out[23]: array([ 0., 1., 2., 3., 11., 5., 12., 7.]) 会保留原始排序。

答案 1 :(得分:0)

这是有效的。转换的工作原理是numpy tofile()只知道C顺序。

import numpy as np
file_path = 'C:/Temp/arr.txt'
x = np.array([0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0])
xf = x.reshape((2, 2, 2), order='F')
xf.T.tofile(file_path, sep=' ') # T is transpose, so it gets written in correct order
xn = np.fromfile(file_path, sep=' ')
xnr = np.reshape(xn, (2,2,2),order='F')
assert (xf==xnr).all()

# show the transpose is necessary
xf.tofile(file_path, sep=' ') # no .T, write in wrong order
xn = np.fromfile(file_path, sep=' ')
xnr = np.reshape(xn, (2,2,2),order='F')
assert (xf==xnr).all()==False