程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了h5py:切片数组数据集的正确方法大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决h5py:切片数组数据集的正确方法?

开发过程中遇到h5py:切片数组数据集的正确方法的问题如何解决?下面主要结合日常开发的经验,给出你关于h5py:切片数组数据集的正确方法的解决方法建议,希望对你解决h5py:切片数组数据集的正确方法有所启发或帮助;

要使用h5py快速切片,请使用“普通香草”切片符号:

file['test'][0:300000]

或者,例如,阅读其他所有元素:

file['test'][0:300000:2]

简单切片(切片对象和单个整数索引)应该非常快,因为它可以直接转换为HDF5超平板选择。

该表达式file['test'][range(300000)]调用h5py的“ fancy indexing”版本,即通过显式索引列表进行索引。HDF5中没有本地方法可以执行此操作,因此h5py在Python中实现了一个(较慢的)方法,但不幸的是,当列表> 1000个元素时,该方法的性能会很差。对于file['test'][np.arange(300000)],也以相同的方式解释。

也可以看看:

[1] http://docs.h5py.org/en/latest/high/dataset.html#fancy- indexing

[2]https://github.com/h5py/h5py/issues/293

解决方法

我在这里有点困惑

据我所知,h5py的.value方法读取整个数据集并将其转储到一个数组中,该数组很慢且不鼓励使用(通常应替换为[()]。正确的方法是使用Numpy式切片)。

但是,我得到的结果令人讨厌(使用h5py 2.2.1):

import h5py
import numpy as np
>>> file = h5py.File("test.hdf5",'w')
# Just fill a test file with a numpy array test dataset
>>> file["test"] = np.arange(0,300000)

# This is TERRIBLY slow?!
>>> file["test"][range(0,300000)]
array([     0,1,2,...,299997,299998,299999])
# This is fast
>>> file["test"].value[range(0,299999])
# This is also fast
>>> file["test"].value[np.arange(0,299999])
# This crashes
>>> file["test"][np.arange(0,300000)]

我猜我的数据集太小了,.value不会显着影响性能,但是第一个选择怎么会这么慢呢?这里的首选版本是什么?

谢谢!

更新
似乎我还不够清楚,抱歉。我确实知道.value将整个数据集复制到内存中,而切片仅会检索适当的子部分。我想知道的是为什么在文件中切片比在复制整个数组然后在内存中切片
。我一直认为hdf5 / h5py是专门实现的,因此切片子部分始终是最快的。

大佬总结

以上是大佬教程为你收集整理的h5py:切片数组数据集的正确方法全部内容,希望文章能够帮你解决h5py:切片数组数据集的正确方法所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。