一维 numpy 数组和 scipy 稀疏矩阵之间的点积

Dot product between 1D numpy array and scipy sparse matrix

假设我有 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 中看到

As of NumPy 1.7, np.dot is not aware of sparse matrices, therefore using it will result on unexpected results or errors. The corresponding dense matrix should be obtained first instead

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

我正在使用 Numpy 1.8.2 和 Scipy 0.15.1。

使用*:

p * q

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

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

稀疏矩阵不是 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).