繁体   English   中英

密集数组与稀疏矩阵的右乘法

[英]Right multiplication of a dense array with a sparse matrix

如果我有一个numpy.ndarray A和一个scipy.sparse.csc_matrix B ,我怎么拿AB 我可以通过说B.dot(A)来做BA ,但另一种方式我只能想到这个:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM