gpt4 book ai didi

python - 使用 h5py 随机读取大型 numpy 矩阵的多行的快速方法

转载 作者:行者123 更新时间:2023-12-01 02:16:08 24 4
gpt4 key购买 nike

我想在 100 毫秒内读取列大小为 200 的存储 numpy 矩阵中随机选择的 2048 行。到目前为止我已经尝试过 h5py 。就我而言,连续模式比 block 运行得更快,出于各种其他原因,我正在尝试使用前者。写入(以某种更有序的方式)非常快(~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 步中生成的 block 无关)
  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 代码中完成的,这应该更快。希望这些能为您指明正确的方向。

关于python - 使用 h5py 随机读取大型 numpy 矩阵的多行的快速方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48362729/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com