Reading/Writing Numpy 中的大型对称矩阵
Reading/Writing a large symmetric matrix in Numpy
我有一个很大的(大于我 RAM 的一半)n×n 对称矩阵 S。我想将它写入磁盘,只使用 ~n^2/2 space 并且能够稍后阅读。写作部分为:
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 和不太快的硬盘驱动器作为存储介质的测试中是这样。所以你可以考虑:
with open('test.dat', 'wb') as fid:
for i in range(n):
S[i,i:].tofile(fid)
并且:
S = np.empty((n, n))
with open('test.dat', 'rb') as fid:
for i in range(n):
data = np.fromfile(fid, count=n-i)
S[i,i:] = data
S[i:,i] = data
我有一个很大的(大于我 RAM 的一半)n×n 对称矩阵 S。我想将它写入磁盘,只使用 ~n^2/2 space 并且能够稍后阅读。写作部分为:
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 和不太快的硬盘驱动器作为存储介质的测试中是这样。所以你可以考虑:
with open('test.dat', 'wb') as fid:
for i in range(n):
S[i,i:].tofile(fid)
并且:
S = np.empty((n, n))
with open('test.dat', 'rb') as fid:
for i in range(n):
data = np.fromfile(fid, count=n-i)
S[i,i:] = data
S[i:,i] = data