簡體   English   中英

存儲稀疏 Numpy 數組

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM