398 words
2 minutes
将Fortran中的数组与矩阵保存为numpy中的.npz文件
我们之前讨论过如何用python在三维矩阵中切片,在Python中保存三维矩阵和它的三个坐标轴的方法有用numpy.savez将数组和矩阵用不同的键值对保存至一个.npz文件。这里将讨论如何用Fortran实现这一过程。
NPY-for-Fortran:npy文件的Fortran接口
Waiting for api.github.com...
NPY-for-Fortran为Fortran提供了npy和npz的接口模块。我们在Fortran中将多种精度的intger, real和cmplx的一维或多维数组保存至npy或npz文件。
先将仓库克隆至本地
git clone https://github.com/xumi1993/NPY-for-Fortran.git然后复制src/npy.f90到任意可调用的路径。
调用NPY-for-Fortran
Fortran程序实例
这里我们定义一个三维矩阵mtx,和它的三个坐标轴x、y和z,然后将他们保存在一个npz文件里
program main use m_npy
integer :: i,j,k real(8) :: mtx(9,10,11), z(9), y(10), x(11) character(len=10) :: fname
fname = 'test.npz' do i=1,9 z(i) = i*0.3 do j=1,10 y(i) = i*0.4 do k=1,11 x(j) = j *0.5 mtx(i,j,k) = 20*i**2 + 100*j + k enddo enddo enddo
call add_npz(fname, 'x', x) call add_npz(fname, 'y', y) call add_npz(fname, 'z', z) call add_npz(fname, 'mtx', mtx)
end program编译
由于npy.f90是一个Fortran模块,所以要先编译这个模块,生成.mod文件,再编译上面这个主程序
gfortran npy.f90 -cgfortran example.f90 npy.f90 -o example_npz其中example.f90是上述主程序。
运行
运行程序后会生成一个test.npz文件。
./example_npz在Python中查看
用numpy.load即可打开npz文件并在Python脚本中调用其数值。
import numpy as npdata = np.load('test.npz')print(data.__dict__)结果为
{'_files': ['x.npy', 'y.npy', 'z.npy', 'mtx.npy'], 'files': ['x', 'y', 'z', 'mtx'], 'allow_pickle': False, 'pickle_kwargs': {'encoding': 'ASCII', 'fix_imports': True}, 'zip': <zipfile.ZipFile file=<_io.BufferedReader name='test.npz'> mode='r'>, 'f': <numpy.lib.npyio.BagObj at 0x7fc3b819c4c0>, 'fid': <_io.BufferedReader name='test.npz'>} 将Fortran中的数组与矩阵保存为numpy中的.npz文件
https://blog.xumijian.me/posts/npyfor/