Python / Numpy:有效地存储非稀疏的大对称数组?

时间:2018-01-19 15:44:26

标签: python arrays numpy matrix storage

我正在尝试将数据存储在我的硬盘驱动器上,该驱动器以200万对称100x100矩阵的形式出现。这些矩阵的几乎所有元素都是非零的。我目前正在200 npy文件中保存这些数据;每个大小为5.1GB,包含100000x100x100 numpy阵列。这占用了超过1TB的硬盘空间。

无论如何,我可以使用矩阵是对称的这一事实来节省我硬盘上的空间吗?

2 个答案:

答案 0 :(得分:2)

要仅存储矩阵的上半部分(包括对角线),您应该可以执行以下操作:

import numpy as np

data = np.load([filename])

flat = []
for a in data:
    flat.append(a[np.triu_indices(100)])

np.savez([filename], *flat)

然后加载它们:

import numpy as np

flat = np.load([filename])

data = []

for name, a in flat:
    arr = np.zeros((100,100),dtype=[dtype])
    arr[np.triu_indices(100)] = a
    arr = arr + arr.T - np.diag(arr.diagonal)
    data.append(arr)

data = np.array(data)

答案 1 :(得分:1)

考虑HDF5。通过h5py python库有很多压缩选项。最受欢迎的两个是lzf(快速减压,中等压缩比)和gzip(减速慢,压缩比好)。使用gzip,您可以选择压缩级别。此外,gzip和lzf允许shuffle过滤器提高压缩率。

对于未压缩大小的密集阵列~8GB(csv),在HDF5中应用lzf后,我通常会看到减少75%。我不希望从npy到HDF5获得如此大的好处,但它仍然可能很重要。

另一个好处是HDF5支持懒惰阅读。在python中,您可以通过h5pydask.array直接执行此操作。

如果您希望沿着这条路走下去,h5py documentation会提供高级代码示例。

免责声明:我与h5py或dask没有任何关系。我发现这些库对高级数据分析很有用。