1

我在一个文件中有一个(20000000, 247)大小尺寸的数组。我有可用的内存。我需要沿行对数据进行洗牌。我已经在. 但是,如果我尝试就地修改以外的任何操作,例如创建一个 random.sampled 索引数组然后返回,我会得到 MemoryError。我也尝试过改组 in 块,然后尝试堆叠块以构建完整的数组,但是. 到目前为止,我发现的唯一解决方案是加载文件,然后执行. 但是,这需要很长时间(已经 5 个小时了,它仍然被洗牌)。30 GB.npy32 GBmmap_modenp.random.permutationparray[p]MemoryErrormmap_mode = 'r+'np.random.shuffle

当前代码:

import numpy as np
array = np.load('data.npy',mmap_mode='r+')
np.random.seed(1)
np.random.shuffle(array)

有没有更快的方法可以在不破坏内存限制的情况下做到这一点?

4

1 回答 1

0

也许不是最好的解决方案,但这是我所依赖的。获取索引数组,然后对其进行洗牌并使用它来获取洗牌后的 mem 映射的 numpy 数组。我认为这比等待 5 个小时要好;)

import numpy as np
array = np.load('data.npy',mmap_mode='r')
rows = array.shape[0]
indices = np.arange(rows)
np.random.seed(1)
np.random.shuffle(indices)

for i in range(rows):
    print(array[indices[i]])
于 2020-07-15T19:27:17.187 回答