[英]Storing a Sparse Numpy Array
我有一個 20,000 x 20,000 Numpy 矩陣,我希望按文件存儲,其中平均體積只有 12 個值。
僅以以下格式存儲值的最有效方法是什么
if array[i][j] == 1:
file.write("{} {} {{}}\n".format(i, j)
其中 (i, j) 是數組的索引?
您可以使用scipy
從密集的 numpy arrays 創建稀疏矩陣,這些矩陣僅存儲具有針對其索引的非零條目的值。
import scipy
import pickle
I = np.eye(10000) #Had 10000 nonzero values along diagonal
S = scipy.sparse.csr_matrix(I)
S
<10000x10000 sparse matrix of type '<class 'numpy.float64'>'
with 10000 stored elements in Compressed Sparse Row format>
這是非常高效的 memory ,您可以在需要時使用pickle
轉儲/加載此稀疏矩陣。
#Pickle dump
file = open("S.pickle",'wb') #160kb
pickle.dump(S, file)
#Pickle load
file = open("S.pickle",'rb')
S = pickle.load(file)
要取回密集表示,您可以簡單地使用.toarray()
取回 NumPy 數組或使用.todense()
取回矩陣類型 object。
S.toarray()
array([[1., 0., 0., ..., 0., 0., 0.],
[0., 1., 0., ..., 0., 0., 0.],
[0., 0., 1., ..., 0., 0., 0.],
...,
[0., 0., 0., ..., 1., 0., 0.],
[0., 0., 0., ..., 0., 1., 0.],
[0., 0., 0., ..., 0., 0., 1.]])
對於事后閱讀的人:@hpaulj 關於使用“np.nonzero”的評論有效地解決了問題!
編輯:這是我用來解決它的代碼!
array1, array2 = np.nonzero(array)
for i in range(0, array1.size):
file.write("{} {} {{}}\n".format(array1[i], array2[i]))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.