代碼
import numpy as np
from scipy.sparse import csr_matrix
arr = np.array([[0,0,0], [0,0,1], [1,0,1]])
mat = csr_matrix(arr)
mat.eliminate_zeros()
print(mat.toarray())
輸出
[[0 0 0]
[0 0 1]
[1 0 2]]
根據檔案,此方法從矩陣中洗掉零條目。但是,為什么還有零呢?
從這個網站,我收集了以下內容:
eliminate_zeros從稀疏模式中洗掉矩陣中的所有零(即,沒有為該位置存盤值,之前存盤了一個 vlaue,但它是 0)。
我仍然可以訪問那些零條目。
print(mat[0, 0])
uj5u.com熱心網友回復:
檔案可能應該更明確。eliminate_zeros根本不影響稀疏矩陣的邏輯內容。
eliminate_zeros改變稀疏矩陣的底層表示而不影響其邏輯內容。它從支持稀疏矩陣的資料陣列中洗掉顯式存盤的零。它用于減少空間消耗,并為假設不會顯式存盤零的演算法準備稀疏矩陣。
它不會從稀疏矩陣中洗掉邏輯零。那是不可能的——你不能有一個帶有一堆無資料洞的稀疏矩陣。它不像一個掩碼陣列。
uj5u.com熱心網友回復:
為了補充另一個答案,我將展示稀疏矩陣的基礎資料存盤。
In [147]: from scipy import sparse
In [148]: arr = np.array([[0,0,0], [0,0,1], [1,0,1]])
該coo格式是最容易理解的
In [149]: M = sparse.coo_matrix(arr)
In [150]: M
Out[150]:
<3x3 sparse matrix of type '<class 'numpy.int64'>'
with 3 stored elements in COOrdinate format>
In [151]: print(M)
(1, 2) 1
(2, 0) 1
(2, 2) 1
這些值實際上存盤在 3 個陣列中:
In [152]: M.data,M.row,M.col
Out[152]:
(array([1, 1, 1]),
array([1, 2, 2], dtype=int32),
array([2, 0, 2], dtype=int32))
csr格式更改row/col陣列:
In [153]: Mr = M.tocsr()
In [154]: Mr.data, Mr.indices, Mr.indptr
Out[154]:
(array([1, 1, 1]),
array([2, 0, 2], dtype=int32),
array([0, 0, 1, 3], dtype=int32))
現在讓我們改變data陣列的一個元素:
In [155]: Mr.data[1] = 0
In [156]: Mr.data
Out[156]: array([1, 0, 1])
eliminate_zeros 找到 0,并將其從資料結構中洗掉:
In [157]: Mr.eliminate_zeros()
In [158]: Mr.data
Out[158]: array([1, 1])
In [159]: Mr.indices
Out[159]: array([2, 2], dtype=int32)
In [160]: Mr.A
Out[160]:
array([[0, 0, 0],
[0, 0, 1],
[0, 0, 1]])
In [161]: print(Mr) # show the coo style values
(1, 2) 1
(2, 2) 1
改變indices和indptr的csr(改變“稀疏圖案”)是比簡單的分配0更多的作業data。因此,該csr格式可讓您對 進行大量更改data,然后進行清理。
無論如何,這eliminate_zeros不是初學者可能需要的東西。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/348486.html
