将numpy ndarray添加到稀疏矩阵中

时间:2013-01-10 04:28:33

标签: python numpy sparse-matrix

我正在尝试将一个numpy ndarray添加到稀疏矩阵中,但我没有成功。我想知道是否有办法这样做,而不将我的稀疏矩阵转换成密集的矩阵。

另一个问题是,是否可以添加两个稀疏矩阵。

 x = np.dot(aSparseMatrix, weights)
 y = x + bias

其中x是我的稀疏矩阵,偏差是numpy数组。我得到的错误是:

NotImplementedError: adding a scalar to a CSC or CSR matrix is not supported

aSparseMatrix.shape (1, 10063)

weights.shape  (10063L, 2L)

bias.shape  (2L,)

2 个答案:

答案 0 :(得分:5)

有不同种类的scipy.sparse矩阵:csr_matrix对于矩阵代数是快速的 但更新速度慢,coo_matrix代数/快速更新速度慢。 它们在scipy.org/SciPyPackages/Sparse中描述。

如果稀疏矩阵为99%0,则sparsematrix + 1为99% - 密集 您可以手动扩展例如 y = dot( x + bias, npvec )
dot( x, npvec ) + bias * npvec
以后使用y的地方 - 可能是短代码,但没有乐趣。

我强烈推荐IPython尝试解决问题:

# add some combinations of scipy.sparse matrices + numpy vecs
# see http://www.scipy.org/SciPyPackages/Sparse

from __future__ import division
import numpy as np
from scipy import sparse as sp

npvec = np.tile( [0,0,0,0,1.], 20 )
Acsr = sp.csr_matrix(npvec)
Acoo = Acsr.tocoo()

for A in (Acsr, Acoo, npvec):
    print "\n%s" % type(A)
    for B in (Acsr, Acoo, npvec):
        print "+ %s = " % type(B) ,
        try:
            AplusB = A + B
            print type(AplusB)
        except StandardError, errmsg:
            print "Error", errmsg

答案 1 :(得分:0)

代替numpy dot产品,使用简单的*产品。 Python将广播并获得正确的结果。

添加不起作用,因为通过numpy点积,结果矩阵的大小与预期不匹配,因此在两个具有不同形状的矩阵之间不能进行相加。