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

Julia 使用HDF5以numpy轴顺序读取HDF5数据,julia,hdf5,Julia,Hdf5,我有一个HDF5文件,其中包含用Python/numpy保存的数组。当我使用HDF5.jl将它们读入Julia时,轴的显示顺序与Python中的显示顺序相反。为了减少在Python和Julia代码库之间移动所涉及的心理练习,我在将数据读入Julia时颠倒了轴顺序。为此,我编写了自己的函数: function reversedims(ary::Array) permutedims(ary, [ ndims(ary):-1:1 ]) end data = HDF5.read(someh5fil

我有一个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)我总是必须导入反向EDIM才能使用它;(2) 我必须记住对我读到的每个
数组执行此操作。我想知道是否有可能:

  • 指示HDF5.jl通过关键字参数或某种全局配置参数以numpy样式的轴顺序读入阵列
  • 使用内置单参数函数反转轴
在我看来,它与您所寻找的一样,但它确实执行阵列复制。如果你可以用python重写hdf5文件,声明返回以列主格式存储的数据,虽然似乎表明数据没有改变,但步幅就是,所以我不知道hdf5文件输出是否会有任何不同


编辑:对不起,我刚才看到您已经在您的函数中使用了
置换ims
。我在Julia方面找不到任何其他东西,但我仍然会尝试
numpy.asfortranarray
,看看这是否有帮助。

最好的方法是创建一个H5py.jl包,该包基于MAT.jl(它读取和写入由Matlab创建的.MAT文件)。另请参见。

或者,您可以扭转阵列的步幅,这与您提到的缺点相同(必须记住每次都要这样做,等等),但它确实避免了内存复制。谢谢——我当前的解决方案没有实现您在评论中提出的吗?我认为
置换ims
(没有
的版本)!
)不会复制数组。改变步幅不是意味着改变维度吗?也许我是糊涂了。@Seanmacksey你是对的,我回答的时候很匆忙,应该注意到常规的
置换ims
功能。我看着线程,发现避免排列IMS调用的一种方法是重新排列步幅和维度。这对非复制置换IMS是否有任何好处值得怀疑。这正是具有不同内部数组结构的语言的本质,您必须在一侧或另一侧进行转换。您是否能够尝试
numpy.asfortranarray
?不幸的是,我无法做到这一点,因为我有使用相同Python代码库的协作者,他们可能不喜欢我切换输出的轴顺序。。。很高兴知道numpy有这个选项。@Seanmacksey,您可以随时请求HDF5.jl的开发人员添加一个参数来切换轴顺序。否则,我就没有建议了。很抱歉