398 words
2 minutes
将Fortran中的数组与矩阵保存为numpy中的.npz文件

我们之前讨论过如何用python在三维矩阵中切片,在Python中保存三维矩阵和它的三个坐标轴的方法有用numpy.savez将数组和矩阵用不同的键值对保存至一个.npz文件。这里将讨论如何用Fortran实现这一过程。

NPY-for-Fortran:npy文件的Fortran接口#

MRedies
/
NPY-for-Fortran
Waiting for api.github.com...
00K
0K
0K
Waiting...

NPY-for-Fortran为Fortran提供了npynpz的接口模块。我们在Fortran中将多种精度的intger, realcmplx的一维或多维数组保存至npynpz文件。

先将仓库克隆至本地

Terminal window
git clone https://github.com/xumi1993/NPY-for-Fortran.git

然后复制src/npy.f90到任意可调用的路径。

调用NPY-for-Fortran#

Fortran程序实例#

这里我们定义一个三维矩阵mtx,和它的三个坐标轴xyz,然后将他们保存在一个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文件,再编译上面这个主程序

Terminal window
gfortran npy.f90 -c
gfortran example.f90 npy.f90 -o example_npz

其中example.f90是上述主程序。

运行#

运行程序后会生成一个test.npz文件。

Terminal window
./example_npz

在Python中查看#

numpy.load即可打开npz文件并在Python脚本中调用其数值。

import numpy as np
data = 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://fuwari.vercel.app/posts/npyfor/
Author
Mijian Xu
Published at
2022-02-01
License
CC BY-NC-SA 4.0