![](/img/trans.png)
[英]Matrix (scipy sparse) - Matrix (dense; numpy array) multiplication efficiency
[英]Right multiplication of a dense array with a sparse matrix
如果我有一个numpy.ndarray
A
和一个scipy.sparse.csc_matrix
B
,我怎么拿A
点B
? 我可以通过说B.dot(A)
来做B
点A
,但另一种方式我只能想到这个:
B.T.dot(A.T).T
有没有更直接的方法来做到这一点?
你的问题最初让我困惑,因为对于我的scipy版本, A.dot(B)
和np.dot(A, B)
都可以正常工作; 稀疏矩阵的.dot
方法只是覆盖了np.dot
。 但是,似乎在此拉取请求中添加了此功能,并且在早于0.14.0的scipy版本中不存在此功能。 我猜你有这些旧版本之一。
这是一些测试数据:
import numpy as np
from scipy import sparse
A = np.random.randn(1000, 2000)
B = sparse.rand(2000, 3000, format='csr')
对于scipy> = 0.14.0的版本 ,您可以简单地使用:
C = A.dot(B)
C = np.dot(A, B)
对于<0.14.0版本 ,这两个版本都会引发ValueError
:
In [6]: C = A.dot(B)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-6-7fbaa337fd94> in <module>()
----> 1 C = A.dot(B)
ValueError: Cannot find a common data type.
相反,您可以使用以下之一:
# your original solution
%timeit B.T.dot(A.T).T
# 10 loops, best of 3: 93.1 ms per loop
# post-multiply A by B
%timeit B.__rmul__(A)
# 10 loops, best of 3: 91.9 ms per loop
正如您所看到的,基本上没有性能差异,尽管我个人认为第二个版本更具可读性。
正如@ shaoyl85刚刚指出的那样,可以直接使用*
运算符而不是直接调用__rmul__()
方法:
# equivalent to B.__rmul__(A)
C = A * B
在确定*
运算符的行为时,矩阵似乎比ndarrays具有更高的优先级。 对于我们这些更习惯于ndarrays行为的人来说,这是一个潜在的问题(其中*
表示元素乘法)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.