使用Julia HDF5按numpy轴顺序读取HDF5数据

5

我有一个包含由Python/numpy保存的数组的HDF5文件。当我使用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 风格的轴顺序读取数组,或者使用内置的单参数函数来反转轴。

  • 指示 HDF5.jl 使用 NumPy 风格的轴顺序读取数组,可以通过关键字参数或某种全局配置参数来实现
  • 也可以使用内置的单参数函数来反转轴
2个回答

2

0

在我看来,permutedims! 可以实现你想要的功能,但它确实会进行数组复制。如果你可以用 Python 重写 hdf5 文件,numpy.asfortranarray 声称可以返回以列为主的格式存储的数据,尽管 numpy internals docs 表明数据似乎没有被改变,只是步幅被改变了,所以我不知道 hdf5 文件输出是否会有任何不同。

编辑:抱歉,我刚刚看到你已经在你的函数中使用了 permutedims。我在 Julia 方面找不到其他信息,但我仍然建议尝试一下 numpy.asfortranarray,看看是否有帮助。


您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - user3288829
谢谢 - 不过我的当前解决方案是否实现了您在评论中提出的建议?我认为permutedims(没有版本)不会进行数组复制。而改变步幅就是交换维度的意思,也许我混淆了。 - Sean Mackesey
@SeanMackesey,你说得对,我回答时匆忙了,应该注意到常规的permutedims函数。我看了这个线程,发现避免使用permutedims的方法是重新排列步幅和维度。这是否对非复制的permutedims有任何好处还有待商榷。这就是具有不同内部数组结构的语言的本质,你必须在一侧或另一侧进行转换。你试过numpy.asfortranarray吗? - user3288829
很遗憾,我不能这样做,因为我有合作者使用相同的Python代码库,他们可能不欣赏我更改输出的轴顺序... 不过,知道numpy有这个选项确实是好事。 - Sean Mackesey
@SeanMackesey,你可以向HDF5.jl的开发人员请求添加一个切换轴顺序的参数。否则,我就没有更多建议了。抱歉。 - user3288829

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接