You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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()方法:
    1. 使用@运算符(推荐,语法简洁):
      cooccurrences = occurrences.transpose() @ occurrences
      # 或者用简写的转置属性 .T
      cooccurrences = occurrences.T @ occurrences
      
    2. 使用dot()方法:
      cooccurrences = occurrences.transpose().dot(occurrences)
      
  • 格式转换说明:运算后结果可能会自动转换为CSR/CSC等更适合矩阵乘法的稀疏格式,如果需要保持DOK格式,可以调用.todok()方法转换:
    cooccurrences = (occurrences.T @ occurrences).todok()
    

内容的提问来源于stack exchange,提问作者Emil

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 05:20:29