我正在尝试将数据存储在我的硬盘驱动器上,该驱动器以200万对称100x100矩阵的形式出现。这些矩阵的几乎所有元素都是非零的。我目前正在200 npy文件中保存这些数据;每个大小为5.1GB,包含100000x100x100 numpy阵列。这占用了超过1TB的硬盘空间。
无论如何,我可以使用矩阵是对称的这一事实来节省我硬盘上的空间吗?
答案 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中,您可以通过h5py或dask.array直接执行此操作。
如果您希望沿着这条路走下去,h5py documentation会提供高级代码示例。
免责声明:我与h5py或dask没有任何关系。我发现这些库对高级数据分析很有用。