【问题标题】:Python sparse intersection of matrices non-zero valuesPython稀疏矩阵非零值的交集
【发布时间】:2016-03-03 03:51:07
【问题描述】:

我有两个稀疏* 邻接矩阵 A1A2type 'numpy.int64'。 相应图的节点由整数标记,矩阵的索引对应于这些节点(矩阵值是节点之间的链接权重)。

我正在尝试计算图表之间的相似性度量。为此,我需要找到每个图的子图的邻接矩阵,其中包含两个图共有的节点。 不能保证矩阵的大小相等或它们之间的公共节点。

结果应该是相同的邻接矩阵,其节点值不在两个图中都等于 0。

例子:

A1:
array([[  0, 1, 2, 1],
       [  1, 0, 0, 0],
       [  2, 0, 0, 0],
       [  1, 0, 0, 0]])
A2:
array([[  0, 0, 1],
       [  0, 0, 0],
       [  1, 0, 0]])

结果:

A1':
array([[  0, 0, 2, 0],
       [  0, 0, 0, 0],
       [  2, 0, 0, 0],
       [  0, 0, 0, 0]])
A2':
array([[  0, 0, 1],
       [  0, 0, 0],
       [  1, 0, 0]])

我使用的矩阵大小约为 10^5 X 10^5。结果大小无关紧要,之后我会切掉最小的大小。 我将多次重复此操作,因此速度很重要。

目前的尝试:

我可以通过以下方式获取公共节点列表:

np.intersect1d(A1.nonzero()[0], A2.nonzero()[0])

但我找不到将其用作过滤器以将不在此列表中的索引的值映射到 0 的方法。

*我认为我不一定需要使用稀疏,但对于以后的可扩展性来说非常可取。

【问题讨论】:

    标签: python numpy scipy


    【解决方案1】:

    如果我正确理解您的问题,根据您提供的示例,您可以简单地使用numpy.in1d 方法为您提供一个布尔数组indices,例如

    A1 = np.array([[  0, 1, 2, 1],
           [  1, 0, 0, 0],
           [  2, 0, 0, 0],
           [  1, 0, 0, 0]])
    A2 = np.array([[  0, 0, 1],
           [  0, 0, 0],
           [  1, 0, 0]])
    
    idx = np.in1d(A1,A2).reshape(A1.shape)
    A1[idx] = 0
    print(A1)
    
    # prints
    [[0 0 2 0]
     [0 0 0 0]
     [2 0 0 0]
     [0 0 0 0]]
    

    对于稀疏矩阵,正确的解决方案取决于您使用的稀疏格式。如果您使用csrcsc 格式,那么您可以对矩阵A1.data 的系数(V_IJ) 应用相同的技术,然后使用结果数组(idx) 修改相应的索引(I and J) 即@987654329 @ 和A1.indptr

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-23
      • 1970-01-01
      相关资源
      最近更新 更多