我在 scipy 中將 dok 轉換為 coo 矩陣,檔案對我來說似乎不清楚。我的目標是不破壞原始矩陣!該檔案指出:
將此矩陣轉換為壓縮稀疏行格式。當 copy=False 時,資料/索引可以在這個矩陣和結果 csr_matrix 之間共享。
然而,它似乎輸出矩陣而不是轉換原始矩陣。我認為“復制”可能會改變從轉換到創建副本的行為,但測驗表明這不可能是真的。我的程式運行時間很長,所以我不想在匯出矩陣之前意外地破壞它:)
mat = scipy.sparse.dok_matrix((10,10),dtype=np.int16)
type(mat)
<class 'scipy.sparse.dok.dok_matrix'>
coo = mat.tocoo(copy=True)
print(type(mat))
<class 'scipy.sparse.dok.dok_matrix'>
print(type(coo))
<class 'scipy.sparse.coo.coo_matrix'>
coo = mat.tocoo(copy=False)
print(type(mat))
<class 'scipy.sparse.dok.dok_matrix'>
print(type(coo))
<class 'scipy.sparse.coo.coo_matrix'>
謝謝!
uj5u.com熱心網友回復:
您不必擔心這一點,您dok.tocoo將永遠是一個副本。此外,像這樣的方法總是回傳一個新矩陣;他們沒有就地運作。共享適用于存盤值和索引的底層資料結構,僅當它們足夠相似時才適用。
a 的底層資料結構dok是 a dict,用于coo3 個 numpy 陣列。不復制資料就無法進行轉換。
他們對這里的檔案很草率,只是從通用模板中復制它。該copy引數在進行“同類轉換”時是相關的,例如dok.todok()或 a coo.tocoo()。但是跨格式的應用程式幾乎總是一個副本 - 我使用“幾乎”,因為我不確定一些像csr.tocsc.
如果您正在撰寫一個采用任何格式的稀疏矩陣的函式,并且需要確保它是,例如coo,您可能需要使用
M1 = M.tocoo(copy=True)
以確保 的任何更改M1都不會出現在 中M,即使M已經是coo。
您的報價來自tocsr. 該dok版本的實際代碼是
self.tocoo(copy=copy).tocsr(copy=False)
在dok首先被轉換為通用coo格式,并從那里到csr(或其他中的一個)。
代碼為dok.tocoo:
def tocoo(self, copy=False):
from .coo import coo_matrix
if self.nnz == 0:
return coo_matrix(self.shape, dtype=self.dtype)
idx_dtype = get_index_dtype(maxval=max(self.shape))
data = np.fromiter(self.values(), dtype=self.dtype, count=self.nnz)
row = np.fromiter((i for i, _ in self.keys()), dtype=idx_dtype, count=self.nnz)
col = np.fromiter((j for _, j in self.keys()), dtype=idx_dtype, count=self.nnz)
A = coo_matrix((data, (row, col)), shape=self.shape, dtype=self.dtype)
A.has_canonical_format = True
return A
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/350870.html
