Numpy数组大于等效列表

yks3o0rb  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(90)

我不明白为什么保存的10000 X 10000 X 7大小的Numpy数组dtype=np.float16是1.4gb,而等效的pickle Python列表大约是500mb。我希望Python pickle列表会比Numpy数组大。
在Python中,我有一个名为all_games的列表,每个列表包含7个子元素float值。
然后使用以下函数从all_games中采样:

def sample_games(all_games, file_name):
    all_games = np.array(all_games, dtype=np.float16)
    DRAW = 10000
    SAMPLE = 10000
    # Generate random indices for the sample
    sampled_indices = rng.choice(all_games.shape[0], size=(SAMPLE, DRAW), replace=True)
    # Get all sub-elements from randomly sampled indices
    sampled_data = all_games[sampled_indices]

    file_name = '***'
    np.save(file_name, sampled_data)

字符串
这将保存一个1.4GB大小的10000,10000,7 Numpy数组。
如果我不将列表转换为Numpy数组,而是使用以下函数:

def sample_games(all_games, file_name):
    DRAW = 10000
    SAMPLE = 10000
    # Generate random indices for the sample
    # Get all sub-elements from randomly sampled indices
    sampled_data = [[random.choice(all_games) for _ in range(DRAW)] for _ in range(SAMPLE)]

    file_name = '***'
    with open(file_name, 'wb') as file:
        pickle.dump(sampled_data, file)


pickle列表是500MB。
有人能解释一下为什么保存的Numpy数组比等效的pickle列表大大约900mb,以及如何将保存的Numpy数组缩小到小于等效的pickle列表的大小吗?

zsohkypk

zsohkypk1#

NumPy不会压缩,你会得到原始的10000×10000×7×16位= 1.4 GB。你可以尝试numpy.savez_compressed
Pickle也不会压缩,但是你会重复引用all_games中相同的内部7元素列表对象,而pickle不会重复显式存储它们。尝试sampled_data = [[random.choice(all_games).copy() for _ in range(DRAW)] for _ in range(SAMPLE)](我刚刚添加了.copy()),看看当它不能利用这一点时会发生什么,你可能最终会得到4.4 GB。

相关问题