如何在Python中将稀疏行添加到稀疏矩阵中?

2024-04-26 01:09:48 发布

您现在位置:Python中文网/ 问答频道 /正文

这个任务在纽比是很小的

import numpy as np

a= np.array([[1,2,3,0,9],[3,2,6,2,7],[0,0,0,8,0],[1,0,0,0,3]])
a + a[1]

输出:

^{pr2}$

看看向量维数是如何自动广播到矩阵的每一行的。在

但是对于稀疏矩阵,存在维数不匹配误差。在

from scipy.sparse import *

a= csr_matrix([[1,2,3,0,9],[3,2,6,2,7],[0,0,0,8,0],[1,0,0,0,3]])
a + a[1]

输出:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-32-74c48fe5106e> in <module>()
      2 
      3 a= csr_matrix([[1,2,3,0,9],[3,2,6,2,7],[0,0,0,8,0],[1,0,0,0,3]])
----> 4 a + a[1]

/opt/anaconda2/lib/python2.7/site-packages/scipy/sparse/compressed.pyc in __add__(self, other)
    337         elif isspmatrix(other):
    338             if (other.shape != self.shape):
--> 339                 raise ValueError("inconsistent shapes")
    340 
    341             return self._binopt(other,'_plus_')

ValueError: inconsistent shapes

有一个用于稀疏乘法的函数,例如,a.multiply(a[1])表示a * a[1](它做得很好),但是我找不到一个用于加法的函数。在

我不熟悉稀疏矩阵。请帮忙。在


Tags: inimportselfnp矩阵scipymatrixsparse
2条回答

尝试使用:

from scipy.sparse import *

a= csr_matrix([[1,2,3,0,9],[3,2,6,2,7],[0,0,0,8,0],[1,0,0,0,3]])
a.todense()+a[1].todense()

它将是:

^{pr2}$

更新:

使加法矩阵b具有相同的维数并用a[1]填满,然后将它们相加:

from scipy.sparse import *
import numpy as np
an_array=np.array([[1,2,3,0,9],[3,2,6,2,7],[0,0,0,8,0],[1,0,0,0,3]])
a = csr_matrix(an_array)
b = csr_matrix([an_array[1] for i in range(len(an_array))])
a+b

尚未为稀疏矩阵实现numpy样式的广播。在

乘法,特别是矩阵乘法,发展很快。事实上,像行求和和和行的选择这样的操作是作为矩阵乘法来实现的,例如M * <column vector of 1s>。乘法通常会得到一个矩阵,如果不是更稀疏的话。在

加减法发展得不好。它通常导致一个更密集的矩阵。极端情况是向所有元素添加标量。即使在您的示例中,结果也是密集的。a和{}都必须非常稀疏才能证明纯稀疏加法的合理性。在

In [713]: a= np.array([[1,2,3,0,9],[3,2,6,2,7],[0,0,0,8,0],[1,0,0,0,3]])
In [714]: aM = sparse.csr_matrix(a)
In [715]: aM
Out[715]: 
<4x5 sparse matrix of type '<class 'numpy.int32'>'
    with 12 stored elements in Compressed Sparse Row format>

我们可以通过矩阵乘法复制选定的行-首先是广播密集方法:

^{pr2}$

稀疏矩阵乘法:

In [721]: sparse.csr_matrix(np.ones((4,1)))*aM[1,:]
Out[721]: 
<4x5 sparse matrix of type '<class 'numpy.float64'>'
    with 20 stored elements in Compressed Sparse Row format>

稀疏矩阵加法:

In [722]: sparse.csr_matrix(np.ones((4,1)))*aM[1,:]+aM
Out[722]: 
<4x5 sparse matrix of type '<class 'numpy.float64'>'
    with 20 stored elements in Compressed Sparse Row format>
In [723]: _.A
Out[723]: 
array([[  4.,   4.,   9.,   2.,  16.],
       [  6.,   4.,  12.,   4.,  14.],
       [  3.,   2.,   6.,  10.,   7.],
       [  4.,   2.,   6.,   2.,  10.]])

如果aM尤其是{}稀疏,这将是一个更好的演示。我也可以将np.ones指定为int数据类型来匹配aM。使其成为csc矩阵会更紧凑。在

相关问题 更多 >