Woo*_*ang 2 python numpy scipy sparse-matrix
Ubuntu16.04_64bit + Python3.5.2 + numpy1.13.3 + scipy1.0.0当我处理a scipy.sparse.csc.csc_matrix和a之间的矩阵乘法时,我遇到了这个问题 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)
Run Code Online (Sandbox Code Playgroud)
然后差异看起来像这样:
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
Run Code Online (Sandbox Code Playgroud)
为什么?它们之间的区别是什么?怎么办呢?
您所看到的是典型的浮点运算(有一个很好的解释,请参阅每个计算机科学家应该知道的关于浮点运算的内容或为什么浮点数不准确的答案?).与实数算术不同,浮点运算中的运算顺序将(略微)改变结果,因为舍入误差以不同方式累积.这意味着计算相同结果的不同方式不能完全一致,但他们会大致同意.
如果您使用np.allclose而不是使用完全相等,则可以看到此内容:
>>> np.allclose(dab, ab)
True
>>> np.allclose(dadb.toarray(), ab)
True
Run Code Online (Sandbox Code Playgroud)
简而言之,这些操作的行为符合预期.
| 归档时间: |
|
| 查看次数: |
74 次 |
| 最近记录: |