【问题标题】:Dot product between 1D numpy array and scipy sparse matrix一维numpy数组和scipy稀疏矩阵之间的点积
【发布时间】:2015-09-11 11:02:47
【问题描述】:

假设我有 Numpy 数组 p 和一个 Scipy 稀疏矩阵 q 这样

>>> p.shape
(10,)
>>> q.shape
(10,100)

我想做 p 和 q 的点积。当我尝试使用 numpy 时,我得到以下信息:

>>> np.dot(p,q)
Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist packages/IPython/core/interactiveshell.py", line 2883, in run_code
    exec(code_obj, self.user_global_ns, self.user_ns)
  File "<ipython-input-96-8260c6752ee5>", line 1, in <module>
    np.dot(p,q)
ValueError: Cannot find a common data type.

我在Scipy documentation 看到了

从 NumPy 1.7 开始,np.dot 不知道稀疏矩阵,因此 使用它会导致意外的结果或错误。这 应该先得到对应的稠密矩阵

但这违背了我使用稀疏矩阵的目的。太棒了,我如何在稀疏矩阵和一维 numpy 数组(numpy 矩阵,我对任何一个都开放)之间做点积而不失去矩阵的稀疏性?

我正在使用 Numpy 1.8.2 和 Scipy 0.15.1。

【问题讨论】:

    标签: python numpy scipy sparse-matrix dot-product


    【解决方案1】:

    使用*:

    p * q
    

    请注意,* 对稀疏矩阵使用类矩阵语义而不是类数组语义,因此它计算的是矩阵乘积而不是广播乘积。

    【讨论】:

    【解决方案2】:

    Scipy 具有用于稀疏矩阵乘法的内置方法。

    文档示例:

    >>> import numpy as np
    >>> from scipy.sparse import csr_matrix
    >>> Q = csr_matrix([[1, 2, 0], [0, 0, 3], [4, 0, 5]])
    >>> p = np.array([1, 0, -1])
    >>> Q.dot(p)
    array([ 1, -3, -1], dtype=int64)
    

    检查这些资源:

    http://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.sparse.csc_matrix.dot.html http://docs.scipy.org/doc/scipy/reference/sparse.html

    【讨论】:

    • 当q在产品的右侧时,这不太方便。
    【解决方案3】:

    稀疏矩阵不是 numpy 数组或矩阵,尽管大多数格式使用多个数组来存储它们的数据。作为一般规则,常规 numpy 函数不知道稀疏矩阵,因此您应该使用函数和运算符的稀疏版本。

    根据大众的需求,最新的np.dot 是稀疏感知的,尽管我不知道它是如何作用的细节。在 1.18 中,我们有多种选择。

    user2357112 建议p*q。首先使用密集数组,我有点怀疑,想知道它是否会尝试使用数组元素乘法(并且由于广播错误而失败)。但它有效。有时像* 这样的运算符会将控制权传递给第二个参数。但为了确保我尝试了几种替代方法:

    q.T * p
    np.dot(p, q.A)
    q.T.dot(p)
    

    都给出相同的密集 (100,) 数组。注意 - 这是一个数组,而不是稀疏矩阵结果。

    要获得我需要使用的稀疏矩阵

    sparse.csr_matrix(p)*q   # (1,100) shape
    

    q 可以是其他稀疏格式,但对于这样的计算,它会转换为csrcsc。而且.T 操作很便宜,因为如果只需要将格式从csr 切换到csc

    如果p 是二维数组,最好检查这些替代方法是否有效,例如(2,10)。

    【讨论】:

      猜你喜欢
      • 2012-12-20
      • 2019-09-10
      • 2013-11-10
      • 1970-01-01
      • 2013-09-24
      • 2017-07-20
      • 2016-08-15
      • 2017-05-17
      • 2014-09-13
      相关资源
      最近更新 更多