【问题标题】:Read HDF5 data with numpy axis order with Julia HDF5使用 Julia HDF5 读取具有 numpy 轴顺序的 HDF5 数据
【发布时间】:2015-10-02 07:23:25
【问题描述】:

我有一个 HDF5 文件,其中包含用 Python/numpy 保存的数组。当我使用 HDF5.jl 将它们读入 Julia 时,轴与它们在 Python 中出现的顺序相反。为了减少在 Python 和 Julia 代码库之间移动所涉及的心理体操,我在将数据读入 Julia 时反转了轴顺序。我已经编写了自己的函数来执行此操作:

function reversedims(ary::Array)
  permutedims(ary, [ ndims(ary):-1:1 ])
end

data = HDF5.read(someh5file, somekey) |> reversedims

这并不理想,因为 (1) 我总是必须导入 reversedims 才能使用它; (2) 我必须记住为我阅读的每个Array 执行此操作。我想知道是否有可能:

  • 指示 HDF5.jl 通过关键字参数或某种全局配置参数以 numpy 样式的轴顺序读取数组
  • 使用内置的单参数函数来反转坐标轴

【问题讨论】:

    标签: julia hdf5


    【解决方案1】:

    最好的方法是创建一个 H5py.jl 包,以 MAT.jl 为模型(读取和写入由 Matlab 创建的 .mat 文件)。另见https://github.com/timholy/HDF5.jl/issues/180

    【讨论】:

      【解决方案2】:

      在我看来,permutedims! 可以满足您的需求,但它确实会进行数组复制。如果您可以在 python 中重写 hdf5 文件,numpy.asfortranarray 声称返回以列主要格式存储的数据,尽管numpy internals docs 似乎暗示数据没有被改变,只是步幅是,所以我不不知道 hdf5 文件输出是否会有所不同

      编辑:抱歉,我刚刚看到你已经在你的函数中使用了permutedims。我在 Julia 方面找不到其他任何东西,但我仍然会尝试 numpy.asfortranarray 看看是否有帮助。

      【讨论】:

      • 或者,您可以反转数组的步幅,这具有您提到的相同缺点(必须记住每次都这样做,等等),但它确实避免了内存复制
      • 谢谢——我目前的解决方案没有实现你在评论中提出的建议吗?我认为permutedims(没有! 的版本)不会进行数组复制。改变尺寸不是改变步幅意味着什么吗?也许我很困惑。
      • @SeanMackesey 你是对的,当我回答时我很着急,应该注意到常规的permutedims 功能。我正在查看this 线程并看到避免 permutedims 调用的一种方法是重新排序步幅和尺寸。这是否对非复制置换有任何好处是值得怀疑的。这只是具有不同内部数组结构的语言的本质,您必须在一侧或另一侧进行转换。你能试试numpy.asfortranarray吗?
      • 不幸的是我不能这样做,因为我有合作者使用相同的 Python 代码库,他们可能不喜欢我切换输出的轴顺序......很高兴知道 numpy 有这个选项不过。
      • @SeanMackesey,您可以随时要求 HDF5.jl 的开发人员添加一个参数来切换轴顺序。否则,我没有建议。对不起
      猜你喜欢
      • 2015-03-20
      • 2016-10-27
      • 2011-05-07
      • 2014-12-01
      • 1970-01-01
      • 2019-06-24
      • 2019-11-15
      • 2018-03-25
      • 2017-09-23
      相关资源
      最近更新 更多