python - 如何计算非常大的 scipy 稀疏矩阵之间的点积

标签 python numpy scipy sparse-matrix matrix-multiplication

我正在尝试找到一个巨大矩阵与其自身之间的点积。

矩阵的形状 (371744, 36154) NonZero 的数量 - 577731 [非常稀疏]

mat1 是 scipy.sparse.csr_matrix 如果我使用 ma​​t1 * mat1.T 我收到一个值错误,这看起来像是因为结果矩阵中有太多非零元素,并且索引指针根据 here 溢出

    dp_data = data_m * data_m.T
  File "/usr/lib/python2.7/dist-packages/scipy/sparse/base.py", line 247, in __mul__
    return self._mul_sparse_matrix(other)
  File "/usr/lib/python2.7/dist-packages/scipy/sparse/base.py", line 300, in _mul_sparse_matrix
    return self.tocsr()._mul_sparse_matrix(other)
  File "/usr/lib/python2.7/dist-packages/scipy/sparse/compressed.py", line 290, in _mul_sparse_matrix
    indices = np.empty(nnz, dtype=np.intc)
ValueError: negative dimensions are not allowed

我也尝试过np.dot

但是doc说,
“从 NumPy 1.7 开始,np.dot 不支持稀疏矩阵,因此使用它会导致意外结果或错误。应首先获取相应的稠密矩阵”

当我使用 mat1.toarray() 或 todense() 时,我收到内存错误,因为矩阵很大!我有16GB内存!该程序似乎适用于较小的输入!

    data_array = data_m.toarray()
  File "/usr/lib/python2.7/dist-packages/scipy/sparse/compressed.py", line 550, in toarray
    return self.tocoo(copy=False).toarray()
  File "/usr/lib/python2.7/dist-packages/scipy/sparse/coo.py", line 219, in toarray
    B = np.zeros(self.shape, dtype=self.dtype)
MemoryError

我正在使用 Numpy 版本 1.8.1 Numpy 版本 0.9.0

我还能怎样做这个乘法?

最佳答案

调用点积作为稀疏矩阵的方法:

dp_data = data_m.dot(data_m)

numpy.dot 是 Universal Function它不知道矩阵的稀疏性,而 scipy.sparse.csc_matrix.dot是一种为您的矩阵类型量身定制的方法,因此使用稀疏算法。

关于python - 如何计算非常大的 scipy 稀疏矩阵之间的点积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24899579/

相关文章:

python - 获取事件上矩阵

Python Pandas : Multi-Column Pivot and Level Swapping

python - 使用 ctypes 将 2d numpy 数组传递给 c

python - 无法安装 Statsmodels...python

python - 将具有多个值的键映射到python中的json

python - 如何在列的两个值之间选择数据框中的所有行

python - 如何强制 scipy.optimize 中的 lesssq 函数优于每个数据点

python - 提高 numpy.dot(python)的精度

python - Matplotlib animate 不更新刻度标签

python - 如何使用 Python 登录网站?