【问题标题】:Can one save Fortran arrays in .npy format?可以将 Fortran 数组保存为 .npy 格式吗?
【发布时间】:2022-01-08 15:40:14
【问题描述】:

我正在使用 Fortran 进行数值计算。 Fortran 中的通用标准是将数组保存为.dat 文件。我想偶尔将数组传输到 Python 以进行进一步操作。做这件事的方法

  • 用python编写脚本来读取.dat文件并生成一个numpy数组
  • 在保存数组时使用 HDF5、NETCDF 等(可在 Python 中访问)

.dat 文件脚本阅读器需要根据数组的存储方式进行定制。为了便于使用,每个文件可能需要存储一个数组。 我的阵列不是那么大,所以我不喜欢使用 HDF5。但是如果没有其他选择,请告诉我。

这与Reading arrays from .npy files into Fortran 90相反

【问题讨论】:

    标签: python arrays numpy fortran numpy-ndarray


    【解决方案1】:

    我的MRedies NPY-for-Fortran 使用得还不够,但它似乎正是您要找的。​​p>

    来自自述文件

    Fortran 的 NPY

    此 Fortran 模块允许将数字 Fortran 数组保存为 Numpy 的 .npy 或 .npz 格式。目前支持的有:

    1. integer(1), integer(2), integer(4), integer(8)
    2. real(4), real(8)
    3. complex(4), complex(8)
    

    *.npy 文件 将数组保存到 .npy 文件中只需调用:

    call save_npy("filename.npy", array) 
    

    另外,请留意fortran standard library 上的这个pull request

    另一个选项,我没有测试过

    不是我的想法先看CAZT'sCAZT's stackoverflow answer评论

    libnpy 似乎是一个库,它提供了使用 NumPy 的二进制格式将 C 或 Fortran 数组保存到数据文件的简单例程。

    以下摘自https://scipy-cookbook.readthedocs.io/items/InputOutput.html

    program fex
        use fnpy
        use iso_c_binding
        implicit none
    
        integer  :: i
        real(C_DOUBLE) :: a(2,4) = reshape([(i, i=1,8)], [2,4])
    
        call save_double("fa.npy", shape(a), a)
    end program fe
    

    程序会创建一个文件fa.npy,您可以按照通常的方式将其加载到python中。

    但 NumPy 数组的条目现在遵循 Fortran(列优先)排序。

    >>> fa = np.load('fa.npy')
    >>> print fa
    [[ 1.  3.  5.  7.]
     [ 2.  4.  6.  8.]] 
    

    您可以使用命令在与fex.f95 相同的目录中构建带有npy.modlibnpy.a 的可执行文件。

    gfortran -o fex fex.f95 libnpy.a
    

    仅供参考,我在https://github.com/kovalp/libnpy偶然发现了一个更新版本的libnpy

    可能的错误

    来自Matthias Redies 如果您使用 libnpy 保存一些数组切片 call save_npy(a(:,1,:)),您将不会高兴。

    【讨论】:

    • 对不起。我不明白
    • 鉴于问题和答案来自同一个人,在我看来,它就像是一个广告,尤其是它的措辞方式。
    • @VladimirF 现在好点了吗?
    • 它在第一个站点看起来真的很像。它们在 SO 上很常见。现在的答案肯定更好。鉴于拉取请求在最近几个小时内处于活动状态,等待结果可能更明智,但如果您使用结果更新答案应该没问题。
    • 顺便说一句,即使是图书馆作者也可以这样回答,这是允许的。重点是说“你可以使用这个库以这种方式做到这一点”,而不仅仅是“这里有一个可以做到这一点的库的链接”。
    猜你喜欢
    • 1970-01-01
    • 2018-02-28
    • 2018-03-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多