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

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

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

对NPY-for-Fortran的修改

原版的NPY-for-Fortran不支持将三维矩阵写入npz文件,因此我在此基础上加入了对各种不同精度三维数组的支持,参考xumi1993/NPY-for-Fortran

先将仓库克隆至本地

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

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

调用NPY-for-Fortran

Fortran程序实例

这里我们定义一个三维矩阵mtx,和它的三个坐标轴xyz,然后将他们保存在一个npz文件里

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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文件,再编译上面这个主程序

1
2
gfortran npy.f90 -c
gfortran example.f90 npy.f90 -o example_npz

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

在Python中查看

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

1
2
3
import numpy as np
data = np.load('test.npz')
print(data.__dict__)

结果为

1
2
3
4
5
6
7
{'_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'>}