Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从向量中减去scipy.sparse矩阵的列_Python_Arrays_Numpy_Scipy_Sparse Matrix - Fatal编程技术网

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

Python 从向量中减去scipy.sparse矩阵的列,python,arrays,numpy,scipy,sparse-matrix,Python,Arrays,Numpy,Scipy,Sparse Matrix,我试图找到一种从numpy向量中减去scipy.sparse矩阵的列的方法,但我似乎找不到一种不改变向量形状的方法。这就是我到目前为止所做的: >>> import scipy.sparse >>> import numpy >>> A = scipy.sparse.eye(10) >>> A = A.tolil() >>> x = numpy.ones(10) >>> x array([

我试图找到一种从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.REFORMATE,但也许有更好的方法。

如果您这样做,速度似乎是原来的两倍:

x -= A[:,5].toarray().flatten()
它避免了形状问题。。。使用此建议和矩阵A的csr_矩阵可将速度提高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.])

有一句古老的格言,可读性很重要,但这句格言并不太好,不过…

谢谢你的回答。它很好用。关于你建议使用csr_矩阵的问题,我没有使用这种格式,因为我认为你不可能通过添加单个元素轻松构建矩阵。还有,你是怎么计时的?你能提供密码让你的答案完整吗?@aaragon我用IPython计时。。。使用magic指令timeit非常简单。。。我将更新答案…通常您使用适合于构建过程的稀疏格式,然后将其转换为适合此处使用的格式,即计算。在内部,稀疏进行了大量转换。您可以将.toarray替换为.a,这样就不那么麻烦了。