【问题标题】:adding a numpy ndarray to a sparse matrix将 numpy ndarray 添加到稀疏矩阵
【发布时间】:2013-01-10 04:28:32
【问题描述】:

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

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

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

其中 x 是我的稀疏矩阵,bias 是 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,)

【问题讨论】:

  • 将密集矩阵添加到稀疏矩阵不会有效地使其密集吗?
  • 没有。它显然没有。
  • 我的意思是我不明白在将它们相加之前不对备用矩阵执行x.todense() 有什么好处,因为结果不会有很多非零项。或者,如果是这样,您可以在添加之前使用csc_matrix(bias) 将密集矩阵转换为稀疏格式。尽管如此,看起来bias 不是ndarray 而是一个标量,您在添加它们之前尝试过np.array(bias) 吗?
  • 我无法将稀疏矩阵变成密集矩阵,因为它太大以至于密集形式无法放入内存。我也尝试过将偏差转换为稀疏矩阵,但它仍然无法添加它们并且 np.array(bias) 不起作用。

标签: python numpy sparse-matrix


【解决方案1】:

有不同种类的 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

【讨论】:

    【解决方案2】:

    使用简单的 * 乘积代替 numpy 点积。 Python 将广播并获得正确的结果。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-13
      • 1970-01-01
      • 2017-06-15
      • 2021-03-17
      • 2021-11-25
      • 2018-08-07
      • 2017-06-15
      • 2017-07-20
      相关资源
      最近更新 更多