如何在DOK稀疏矩阵中实现类似Numpy的@矩阵乘法?
问题描述
我有一个名为occurrences的稀疏DOK矩阵和一个名为occurrences_np的Numpy矩阵,二者均用于统计文档中的词频。想要通过将occurrences的转置与自身相乘得到共现矩阵:
- 在Numpy矩阵上,通过
np.transpose(occurrences_np) @ occurrences_np成功实现 - 尝试用
occurrences.multiply(occurrences.transpose())时,出现报错:
File "<ipython-input-160-5bd1761dd328>", line 185, in create_cooccurrences cooccurrences = self.occurrences.multiply(self.occurrences.transpose()) File "C:\Users\20200016\Anaconda3\lib\site-packages\scipy\sparse\base.py", line 336, in multiply return self.tocsr().multiply(other) File "C:\Users\20200016\Anaconda3\lib\site-packages\scipy\sparse\compressed.py", line 406, in multiply raise ValueError("inconsistent shapes")
请问如何在DOK矩阵中进行矩阵乘法操作?
解决方法
- 报错原因:
multiply()是稀疏矩阵的逐元素乘法,要求两个矩阵的形状完全一致。而转置后的矩阵形状与原矩阵不同(假设原矩阵是M×N,转置后是N×M),因此触发形状不匹配的报错。 - 正确的矩阵乘法方式:和Numpy类似,稀疏矩阵的矩阵乘法可以用
@运算符,或者dot()方法:- 使用
@运算符(推荐,语法简洁):cooccurrences = occurrences.transpose() @ occurrences # 或者用简写的转置属性 .T cooccurrences = occurrences.T @ occurrences - 使用
dot()方法:cooccurrences = occurrences.transpose().dot(occurrences)
- 使用
- 格式转换说明:运算后结果可能会自动转换为CSR/CSC等更适合矩阵乘法的稀疏格式,如果需要保持DOK格式,可以调用
.todok()方法转换:cooccurrences = (occurrences.T @ occurrences).todok()
内容的提问来源于stack exchange,提问作者Emil
相关产品推荐
相关产品推荐

