【发布时间】:2021-09-13 07:41:39
【问题描述】:
我有一个大的 numpy 数组 A 形状为 (2_000_000, 2000) 的 dtype float64,需要 32 GB。
(或者将相同的数据分成10个形状(200_000、2000)的数组,序列化可能更容易?)。
我们如何将其序列化到磁盘,以便我们可以快速随机读取数据的任何部分?
更准确地说,我需要能够从A 以随机起始索引i 读取一万个形状(16、2 000)的窗口:
L = []
for i in range(10_000):
i = random.randint(0, 2_000_000 - 16):
window = A[i:i+16, :] # window of A of shape (16, 2000) starting at a random index i
L.append(window)
WINS = np.concatenate(L) # shape (10_000, 16, 2000) of float64, ie: ~ 2.4 GB
假设我只有 8 GB 的 RAM 可用于此任务;将整个 32 GB 的 A 加载到 RAM 中是完全不可能的。
我们如何在磁盘上序列化的 numpy 数组中读取此类窗口?(.h5 格式或任何其他格式)
注意:读取是在随机起始索引处完成的这一事实很重要。
【问题讨论】:
-
这能回答你的问题吗? stackoverflow.com/questions/29209293/…
-
谢谢@orlp,它是相关的,但它没有回答它,因为这里的具体部分是我需要能够随机启动原始大数组的窗口/切片点。这些细节使其更加具体。
-
你可以试试 NumPy 内存映射:
numpy.memmap(filename, dtype=<class 'numpy.ubyte'>, mode='r+', offset=0, shape=None, order='C') -
@RyanPepper 我试过了,但这是我遇到的问题:stackoverflow.com/questions/68209831/…
-
@orlp 建议将数据写入 HDF5 文件是一个很好的解决方案。一旦数组在文件中,就很容易从数据集中读取切片。 h5py 包支持 NumPy 索引(包括一些花哨的索引技术)。
标签: python arrays numpy hdf5 numpy-memmap