我正在尝试找到一个巨大矩阵与其自身之间的点积。
矩阵的形状 (371744, 36154) NonZero 的数量 - 577731 [非常稀疏]
mat1 是 scipy.sparse.csr_matrix 如果我使用 mat1 * 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/