Вы можете использовать iso.categorical_edge_match
для определения функции сравнения, чтобы при проверке изоморфности обеих сетей c учитывались атрибуты ребра weight
:
G1 = nx.from_numpy_matrix(graph1)
G2 = nx.from_numpy_matrix(graph2)
Обратите внимание, что веса, в основном, просто атрибуты ребер:
G1.edges(data=True)
# EdgeDataView([(0, 0, {'weight': 1.0}), (0, 1, {'weight': 0.5})...
G2.edges(data=True)
# EdgeDataView([(0, 0, {'weight': 1.0}), (0, 2, {'weight': 1.5})...
Итак, мы хотим определить функцию сравнения, в которой эти атрибуты сравниваются, когда iso.categorical_edge_match
получает два ребра от G1
и G2
:
import networkx.algorithms.isomorphism as iso
em = iso.categorical_edge_match('weight', 'weight')
Теперь при использовании nx.is_isomorphic
установите edge_match
для функции сравнения em
, определенной выше, с помощью iso.categorical_edge_match
, чтобы она вызывалась для каждого сравниваемого ребра, чтобы проверить, их веса равны:
nx.is_isomorphic(G1, G2, edge_match=em)
# False
Так как edge_match
ожидает вызова, и мы хотим сравнивать только атрибуты, в этом случае мы также можем определить нашу собственную простую функцию сравнения так что атрибуты ребер также учитываются:
nx.is_isomorphic(G1, G2, edge_match=lambda x,y: x['weight']==y['weight'])
# False