![](/img/trans.png)
[英]What is difference between the function numpy.dot(), @, and method .dot() for matrix-matrix multiplication?
[英]Python: Inconsistency between sparse matrix multiplication and numpy.dot()
Ubuntu16.04_64bit + Python3.5.2 + numpy1.13.3 + scipy1.0.0在處理scipy.sparse.csc.csc_matrix
和numpy.ndarray
之間的矩陣乘法時,出現了這個問題。 我將在此處給出一個示例:
import numpy as np
import scipy.sparse
a = np.random.random(1000,1000)
b = np.random.random(1000,2000)
da = scipy.sparse.csc.csc_matrix(a)
db = scipy.sparse.csc.csc_matrix(b)
ab = a.dot(b)
dadb = da.dot(db)
dab = da.dot(b)
那么區別如下:
In [31]: np.sum(dadb.toarray() != ab)
Out[31]: 1869078
In [33]: np.sum(dab != dadb.toarray())
Out[33]: 0
In [34]: np.sum(dab != ab)
Out[34]: 1869078
為什么? 它們之間有什么區別? 怎么辦呢?
您所看到的是典型的浮點算術(有關詳細說明,請參閱每位計算機科學家應了解的有關浮點算術的知識,或有關為何為何浮點數不正確的答案? )。 與真實算術不同,浮點算術中的運算順序將(略)更改結果,因為舍入誤差以不同的方式累積。 這意味着不能期望使用不同的方法來計算相同結果的方式完全一致,但它們會大致一致。
如果使用np.allclose
而不是完全相等,則可以看到以下內容:
>>> np.allclose(dab, ab)
True
>>> np.allclose(dadb.toarray(), ab)
True
簡而言之,這些操作的行為符合預期。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.