使用 h5py 随机读取大型 numpy 矩阵的多行的快速方法
A quick way to randomly read many rows of a large numpy matrix with h5py
我想在 100 毫秒内读取列大小为 200 的已存储 numpy 矩阵的 2048 行随机选择行。到目前为止,我已经尝试过使用 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 以外的方法。我试过使用较小的最大矩阵大小,但它根本不影响计算时间。作为参考,以下是我试图作为深度强化学习算法的一部分实现的整个任务:
- 生成一个大小为 (2048, 200) 的 numpy 数组
- 将其写入可扩展列表中下一个可用的 2048 行(None、200)
- 从可扩展列表的填充行中随机选择2048行(与步骤1中生成的块无关)
- 阅读选择的行
- 继续1-4 100k次(因此列表总大小变为(2048*100k, 200))
如果可以多次选择行,我会尝试:
random.choices(a, k=2048)
否则,使用:
random.sample(a, 2048)
如果 a 是一个 numpy ndarray,这两种方法都会 return 一个 numpy 数组列表。
此外,如果 a 已经是一个 numpy 数组,为什么不利用 numpy 的切片功能并将代码缩短为:
x.append(a[np.randint(1, 2048, 2048)])
这样 a 仍然可以多次访问,但都是用优化的 C 代码完成的,应该会更快。
希望这些能为您指明正确的方向。
我想在 100 毫秒内读取列大小为 200 的已存储 numpy 矩阵的 2048 行随机选择行。到目前为止,我已经尝试过使用 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 以外的方法。我试过使用较小的最大矩阵大小,但它根本不影响计算时间。作为参考,以下是我试图作为深度强化学习算法的一部分实现的整个任务:
- 生成一个大小为 (2048, 200) 的 numpy 数组
- 将其写入可扩展列表中下一个可用的 2048 行(None、200)
- 从可扩展列表的填充行中随机选择2048行(与步骤1中生成的块无关)
- 阅读选择的行
- 继续1-4 100k次(因此列表总大小变为(2048*100k, 200))
如果可以多次选择行,我会尝试:
random.choices(a, k=2048)
否则,使用:
random.sample(a, 2048)
如果 a 是一个 numpy ndarray,这两种方法都会 return 一个 numpy 数组列表。
此外,如果 a 已经是一个 numpy 数组,为什么不利用 numpy 的切片功能并将代码缩短为:
x.append(a[np.randint(1, 2048, 2048)])
这样 a 仍然可以多次访问,但都是用优化的 C 代码完成的,应该会更快。 希望这些能为您指明正确的方向。