我有一个大小为50*10000的csr格式稀疏矩阵A
,和一个大小为50的np.array v
,我想为其计算乘积v.dot(A)
。我如何有效地做到这一点
当然,运行v.dot(A)
不是一个好主意,因为scipy.sparse不支持np操作。不幸的是,据我所知,scipy.sparse没有矩阵与向量左乘的函数
我尝试过以下方法,但所有这些方法似乎都花费了大量时间:
.dot
我转置A,然后使用.dot
方法。它将A.T
与v
相乘作为列向量
```
>>> A = sparse.csr_matrix([[1, 2, 0, 0],
... [0, 0, 3, 4]])
>>> v = np.array([1, 1])
>>> A.T.dot(v)
array([1, 2, 3, 4], dtype=int32)
```
我正在使用csr_matrix.multiply()
方法,它执行逐点乘法。我将对这些行求和
>>> vt = v[np.newaxis].T
>>> A.multiply(vt).sum(axis=0)
matrix([[1, 2, 3, 4]], dtype=int32)
.dot
方法我尝试了不同的施工方法,似乎都很昂贵。这是最具可读性的示例(可能不是最有效的示例):
>>> sparse_v = sparse.csr_matrix(v)
>>> sparse_v.dot(A).todense()
matrix([[1, 2, 3, 4]], dtype=int32)
方法1是目前最快的,但是.T
方法仍然非常耗时。难道没有更好的方法在稀疏矩阵上执行左乘法吗
@operator也适用于scipy稀疏矩阵,与您的方法进行简短而粗略的性能比较表明@operator的性能与您的方法1类似
A.T
返回一个新的矩阵,但为csc格式。否则,变化很小。但它不像密集转置那样是一种view
实际上,与制作原始稀疏矩阵所需的时间相比,该时间相当不错:
稀疏优化用于大型非常稀疏矩阵的矩阵乘法。使用密集阵列(只要它们适合内存),大多数其他操作都会更快
稀疏矩阵的默认乘法是矩阵
@
,__matmul__
委托给__mul__
。稀疏dot
也可以*
和dot
时间相同,@
稍微慢一点。 In[758]:timeit A.T*(v)每个回路95.6µs±424 ns(7次运行的平均值±标准偏差,每个10000个回路)
从时间中删除转置:
第二种方法使用稀疏元素乘法:
这不如矩阵乘法有效
结果是另一个稀疏矩阵
sum(axis=0)
实际上是作为矩阵乘法实现的。这个和的extractor
矩阵是sparse.csr_matrix([1,1])
。但这只是上一个例子中的sparse_v
应谨慎看待所有这些时间安排
A
很小,而且不是很稀疏。将此行和与更大的稀疏矩阵进行比较:相关问题 更多 >
编程相关推荐