2016-03-03 163 views
0

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

我正试图计算图形之间的相似性度量。要做到这一点,我需要找到每个图的子图的邻接矩阵,其中包含两个图共有的节点。 没有关于矩阵的等号大小,或它们之间的公共节点的保证。

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

实施例:

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×10^5的顺序。由此产生的大小并不重要,我会在之后分割最小的大小。 我会多次重复这个操作,所以速度很重要。

尝试至今:

我可以得到普通节点由列表:

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

但我无法找到使用此作为过滤器,为指数的值不会映射的方法在这个列表为0.

*我不认为我一定需要使用稀疏,但稍后可伸缩性是非常可取的。

回答

1

如果我理解正确的话你的问题,根据您所提供的例子,你可以简单地使用numpy.in1d方法给你一个布尔数组指数,例如

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)A1.indicesA1.indptr