Python:稀疏矩阵乘法和数字.dot()

2024-06-28 19:03:54 发布

您现在位置:Python中文网/ 问答频道 /正文

Ubuntu16.04\u 64位+Python3.5.2+numpy1.13.3+scipy1.0.0 我在处理scipy.sparse.csc.csc_matrixnumpy.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

为什么?他们之间有什么区别?怎么处理?你知道吗


Tags: innumpyabnprandomscipyoutmatrix
1条回答
网友
1楼 · 发布于 2024-06-28 19:03:54

您看到的是典型的浮点运算(要获得更好的解释,请参阅What Every Computer Scientist Should Know About Floating-Point ArithmeticWhy Are Floating Point Numbers Inaccurate?的答案)。与实数运算不同,浮点运算的运算顺序会(轻微)改变结果,因为舍入误差以不同的方式累积。这意味着,计算同一结果的不同方法不能期望完全一致,但它们将大致一致。你知道吗

如果使用np.allclose而不是使用完全相等,则可以看到这一点:

>>> np.allclose(dab, ab)
True

>>> np.allclose(dadb.toarray(), ab)
True

简言之,这些操作的行为符合预期。你知道吗

相关问题 更多 >