Python稀疏交集的矩阵非零值

时间:2016-03-03 03:51:07

标签: python numpy scipy

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

我试图计算图表之间的相似性度量。为此,我需要找到每个图的子图的邻接矩阵,其中包含两个图共有的节点。 没有关于矩阵的等于大小或它们之间的公共节点的信息。

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

示例:

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。

*我认为我不一定需要使用稀疏,但以后的扩展性非常好。

1 个答案:

答案 0 :(得分:2)

如果我正确理解您的问题,根据您提供的示例,您只需使用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格式,则可以对矩阵(V_IJ)的系数A1.data应用相同的技术,然后使用生成的数组(idx)修改相应的索引(I and J),即A1.indicesA1.indptr