如果您知道矩陣匹配稀疏 - 非零和非匹配非零索引的數量,您可以比較data
。
np.allclose(sim.data,sim_prev.data,atol=eps)
如果矩陣是以相同的方式構造的,或者一個是保留另一個的稀疏性的推導,那將是真的。
一些時間測試:
In [153]: M = sparse.random(1000,1000,.2, 'csr')
In [154]: M
Out[154]:
<1000x1000 sparse matrix of type '<class 'numpy.float64'>'
with 200000 stored elements in Compressed Sparse Row format>
相同形狀的另一個矩陣,但不同的稀疏
In [155]: M1 = sparse.random(1000,1000,.2, 'csr')
In [156]:
In [156]: timeit np.abs(M-M1).max()
12.3 ms ± 339 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
In [157]: timeit np.abs(M.A-M1.A).max()
24.4 ms ± 624 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
如果稀疏矩陣的比賽中,我們可以爲節省大量的時間比較data
屬性:
In [158]: M2 = M.copy()
In [159]: M2.data += np.random.rand(M2.data.shape[0])*.001
In [160]: timeit np.abs(M.data-M2.data).max()
2.77 ms ± 13.7 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
初步檢查稀疏性可以節省大量的時間(提供我們並不擔心epsilon
大小非零值):
In [170]: timeit np.allclose(M.indptr,M1.indptr)
97.8 µs ± 2.29 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
取下定時toarray()
步驟,在效果上allclose
等效尺寸密集陣列:
In [164]: %%timeit Ma=M.A; M1a=M1.A
...: np.abs(Ma-M1a).max()
...:
14.8 ms ± 31 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
稀疏矩陣的減法比我預期的要好。
其實我不需要用np.abs
; Python的abs
委託給M.__abs__
方法,該方法是:
def __abs__(self):
return self._with_data(abs(self._deduped_data()))
一般來說,'numpy'功能不與'sparse'矩陣工作。有例外,通常是因爲該功能將操作委託給矩陣方法。我不記得一個稀疏的等價物,但檢查文檔。 – hpaulj
爲了從頭開始,我首先比較'shape','dtype'和'nnz'。然後比較'sim.indptr'屬性。這是整數,我認爲應該是'allclose'。從那裏我們必須比較'.indices'和'data'屬性。但是我們可能需要首先檢查它們是否是「無用的」 - 全部零都已被刪除,重複總結,並按順序排列。很多事情要檢查。 – hpaulj