Ошибка Networkx: "в _not_implemented_for терминах {{направлено": graph.is_directed ()} " - PullRequest
0 голосов
/ 03 декабря 2018

Я пытаюсь реализовать некоторую проблему с кластеризацией, однако я сталкиваюсь со следующей проблемой: здесь ошибка imformtionis:

File "/Users/shaoyupei/Desktop/project ", line 99, in <module>
c=new_clustering(H,list_)

File "/Users/shaoyupei/Desktop/project ", line 83, in new_clustering
c = nx.connected_component_subgraphs(G)

File "<decorator-gen-232>", line 2, in connected_component_subgraphs

File "/anaconda3/lib/python3.6/site-      packages/networkx/utils/decorators.py", line 58, in _not_implemented_for
terms = {'directed': graph.is_directed(),

AttributeError: 'NoneType' object has no attribute 'is_directed'

Здесь есть код, который выполняет: ввод графика и списка ребер с взвешеннымиПовторите, чтобы переместить первый элемент в списке ребер, пока раздел не появится. Вот форма списка ввода:

list_=[(('name', 'year'), 0.9), (('aunt', 'work'), 0.5173567819580527), (('family', 'world'), 0.5154954800891427), (('aunt', 'moment'), 0.5096782251214088), (('full', 'glad'), 0.5080586691030745), (('bed', 'miserable'), 0.5074225221081745), (('miserable', 'name'), 0.5074225221081745) ...]

и вот код:

def new_clustering(G,_list):
  c= nx.connected_component_subgraphs(G) # postion1
  c =list(c)
  l= len(c)
  l2=-1
  while (l2 < l+1):
      e = _list.pop(0)[0]
      G = G.remove_edge(*e)
      c = nx.connected_component_subgraphs(G) #postion2
      c = list(c)
      l2= len(c)

  return c

H= H.to_undirected()
k=new_clustering(H,list_)

вот что происходит, я знаю, nx.connected_component_subgraphs(G) реализуется только для неориентированного графа, однако ошибка не возникает в postion1 кода, и я успешно сдвигаю грань, но это происходит при первомитерация position2, как получилось?

1 Ответ

0 голосов
/ 03 декабря 2018

Проблема в этой строке G = G.remove_edge(*e).

G.remove_edge изменяет G "на месте".То есть он непосредственно удаляет ребро из G.Он не возвращает новый график, который выглядит как G с удаленным ребром.Поэтому, когда вы делаете G = G.remove_edge(*e), вы удаляете ребро из G, а затем создаете новую переменную G, которая будет возвращена из G.remove_edge(*e).Но ничего не возвращается.Итак, G теперь стало None.

Вот пример:

import networkx as nx
G= nx.Graph()
G.add_edge(1,2)
print(G.edges())
> [(1, 2)]
A=G.remove_edge(1,2)  #it's removing the edge directly from `G` and assigning the returned value to be `A`.
print(G.edges())  #no edges,
> []
print(A)  #since `G.remove_edge` doesn't return anything, this is None
> None  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...