3

我正在编写一个应用程序,它读取带有 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 ascii 加载器(例如numpy.loadtxt等)就足够了。

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

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')吗?

4

2 回答 2

1

这是有效的。转置解决了 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
于 2016-02-17T14:54:42.600 回答
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是一个2x2x2Fortran 排序的视图x。您可以对其进行修改x并将相应地更改:

In [22]: xf[0,:,1] = [11, 12]

In [23]: x
Out[23]: array([  0.,   1.,   2.,   3.,  11.,   5.,  12.,   7.])

导出x将保留原始顺序。

于 2013-07-22T20:13:55.773 回答