一种使用 h5py 随机读取大型 numpy 矩阵的许多行的快速方法



我想在 2048 毫秒内读取列大小为 200 的存储 numpy 矩阵的 100 行随机选择。到目前为止,我已经尝试过使用 h5py。就我而言,连续模式比块工作得更快,出于各种其他原因,我正在尝试使用前者。写作(以某种更有序的方式)非常快(~3ms);不幸的是,读取 2048 个随机选择的行大约需要 250 毫秒。我正在尝试的阅读部分如下:

a = f['/test']
x = []
for i in range(2048):
r = random.randint(1,2048)
x.append(a[[r],...])
x = np.concatenate(x, 0)

显然,速度瓶颈是由于访问"a"2048 次,因为我不知道是否存在访问随机行的一次性方法。 np.concatenate 消耗的时间可以忽略不计。由于矩阵最终达到(2048*100k,200)的大小,我可能不能使用连续h5py以外的方法。我尝试使用较小的最大矩阵大小,但它根本不影响计算时间。作为参考,以下是我作为深度强化学习算法的一部分尝试实现的整个任务:


  1. 生成大小为 (2048, 200) 的 numpy 数组
  2. 将其写入可扩展列表中的下一个可用 2048 行(无,200)
  3. 从可扩展列表的填充行中随机选择 2048 行(无论步骤 1 中生成的块如何)
  4. 读取选取的行
  5. 继续 1-4 次 100k 次(因此总列表大小变为 (2048*100k, 200))

如果可以多次选择行,我会尝试:

random.choices(a, k=2048)

否则,请使用:

random.sample(a, 2048)

如果a是 numpy ndarray,这两种方法都将返回 numpy 数组的列表。

此外,如果a已经是一个 numpy 数组,为什么不利用 numpy 的切片功能并将代码缩短为:

x.append(a[np.randint(1, 2048, 2048)])

这样a仍然可以多次访问,但它都是在优化的 C 代码中完成的,这应该更快。 希望这些能为你指明正确的方向。

最新更新