我有A1
的两个稀疏*邻接矩阵A2
和type '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。
*我认为我不一定需要使用稀疏,但以后的扩展性非常好。
答案 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]]
对于稀疏矩阵,正确的解决方案取决于您使用的稀疏格式。如果您使用的是csr
或csc
格式,则可以对矩阵(V_IJ)
的系数A1.data
应用相同的技术,然后使用生成的数组(idx)
修改相应的索引(I and J)
,即A1.indices
和A1.indptr
。