繁体   English   中英

从向量中减去scipy.sparse矩阵的列

[英]subtract column of scipy.sparse matrix from a vector

我试图找到一种方法从numpy向量中减去scipy.sparse矩阵的一列,但我似乎找不到一种方法来做到这一点而不改变向量的形状。 这是我到目前为止:

>>> import scipy.sparse
>>> import numpy
>>> A = scipy.sparse.eye(10)
>>> A = A.tolil()
>>> x = numpy.ones(10)
>>> x
array([ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.])
>>> x.shape
(10,)
>>> x -= A[:,5].T
>>> x
matrix([[ 1.,  1.,  1.,  1.,  1.,  0.,  1.,  1.,  1.,  1.]])
>>> x.shape
(1, 10)

有没有更好的方法来实现这一目标? 我想我可以使用numpy.reshape但也许有更好的方法。

看起来它的速度是你的两倍:

x -= A[:,5].toarray().flatten()

它避免了形状问题...使用这个建议和矩阵A csr_matrix给出了10倍的加速...

import numpy as np
import scipy.sparse

x = np.ones(10)
A = A = scipy.sparse.eye(10).tolil()
%timeit np.asarray(x-A[:,5].T).flatten()
# 1000 loops, best of 3: 1.3 ms per loop
%timeit x-A[:,5].toarray().flatten()
# 1000 loops, best of 3: 494 µs per loop

A = A.tocsc()
%timeit np.asarray(x-A[:,5].T).flatten()
# 1000 loops, best of 3: 410 µs per loop
%timeit x-A[:,5].toarray().flatten()
# 1000 loops, best of 3: 334 µs per loop

A = A.tocsr()
%timeit np.asarray(x-A[:,5].T).flatten()
# 1000 loops, best of 3: 264 µs per loop
%timeit x-A[:,5].toarray().flatten()
# 10000 loops, best of 3: 185 µs per loop

绝对最快,特别是如果您的矩阵非常稀疏,几乎肯​​定会使用CSC格式并执行以下操作:

>>> A = A.tocsc()
>>> A.sum_duplicates() # just in case...
>>> col = 5
>>> sl = slice(A.indptr[col], A.indptr[col+1])
>>> data = A.data[sl]
>>> indices = A.indices[sl]
>>> out = x.copy()
>>> out[indices] -= data
>>> out
array([ 1.,  1.,  1.,  1.,  1.,  0.,  1.,  1.,  1.,  1.])

有一句古老的谚语“可读性很重要”,但这并不太好,尽管......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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