在Numpy中读取/写入大型对称矩阵

在Numpy中读取/写入大型对称矩阵,numpy,Numpy,我有一个大的(超过我RAM的一半)n×n对称矩阵S。我想将它写入磁盘,只使用~n^2/2的空间,以后可以读取它。写作部分是: S[np.tril_indices(n)].tofile(fid) 以及以下内容: S = np.zeros((n,n)) S[np.tril_indices(n)]=np.fromfile(fid) S = S + np.tril(S, -1).T 问题是我创建的所有临时数组都不适合内存在本例中,普通Python循环似乎是最快、最简单的解决方案。当矢量化方法确实适合

我有一个大的(超过我RAM的一半)n×n对称矩阵S。我想将它写入磁盘,只使用~n^2/2的空间,以后可以读取它。写作部分是:

S[np.tril_indices(n)].tofile(fid)
以及以下内容:

S = np.zeros((n,n))
S[np.tril_indices(n)]=np.fromfile(fid)
S = S + np.tril(S, -1).T

问题是我创建的所有临时数组都不适合内存

在本例中,普通Python循环似乎是最快、最简单的解决方案。当矢量化方法确实适合内存时,速度也比矢量化方法快,至少在我对Numpy 1.8.2和速度不如存储介质的硬盘驱动器的测试中是这样。所以你可以考虑:

打开('test.dat','wb')作为fid:
对于范围(n)中的i:
S[i,i:][.tofile(fid)
以及:

S=np.empty((n,n))
打开('test.dat','rb')作为fid:
对于范围(n)中的i:
数据=np.fromfile(fid,计数=n-i)
S[i,i:]=数据
S[i:,i]=数据

您在写作中也遇到了问题吗?也许可以试试numpy.savez_compressed@gg349对据我所知,S[np.tril_idices(n)]创建了一个copy@dnalowS本身上压缩的savez_结果的大小大于n^2/2*8(8表示浮点64)