我正在编写一个应用程序,它读取带有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')
吗?
答案 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