AttributeError: у объекта 'NodeView' нет атрибута 'index' - PullRequest
0 голосов
/ 03 сентября 2018

Я использую библиотеку Networkx pyhton.

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

def _set_up_p0(self, source):
        """ Set up and return the 0th probability vector. """
        p_0 = [0] * self.OG.number_of_nodes()

        for source_id in source:
            try:
                # matrix columns are in the same order as nodes in original nx
                # graph, so we can get the index of the source node from the OG
                source_index = self.OG.nodes().index(source_id)
                p_0[source_index] = 1 / float(len(source))
            except ValueError:
                sys.exit("Source node {} is not in original graph. Source: {}. Exiting.".format(
                          source_id, source))
        return np.array(p_0)

Приведенный выше код генерирует исключение:

Traceback (most recent call last):
  File "run_walker.py", line 80, in <module>
    main(sys.argv)
  File "run_walker.py", line 76, in main
    wk.run_exp(seed_list, opts.restart_prob,opts.original_graph_prob, node_list)
  File "./Python_directory/Walker/walker.py", line 57, in run_exp
    p_0 = self._set_up_p0(source)
  File "./Python_directory/Walker/walker.py", line 118, in _set_up_p0
    print(self.OG.nodes().index(source_id))
AttributeError: 'NodeView' object has no attribute 'index'

на самом деле следующие две строки:

print source
print(self.OG.nodes())

мы получаем следующую ошибку:

['0', '1']
['1', '0', '3', '2', '4']

Поэтому, когда я вызываю функцию _set_up_p0, я получаю указанное выше исключение. Где моя ошибка, если вы ее обнаружили?

Ответы [ 2 ]

0 голосов
/ 03 сентября 2018

Когда вы запрашиваете list для index определенного элемента, он выполняет линейный поиск с начала, чтобы найти первый соответствующий элемент. Это медленно. Это также подвержено ошибкам, поскольку идентичные узлы будут пропущены, так как будет найден только первый.

Вместо преобразования в list вы можете enumerate nodes. Это сгенерирует последовательность индексов и узлов.

Вы также можете преобразовать source в set, если это еще не сделано, чтобы сделать поиск более эффективным:

source = set(source)

proportion = 1 / float(len(source))

for index, node in enumerate(self.OG.nodes()):
    if node in source:
        p_0[index] = proportion

edit: альтернативно, вы можете создать p_0 в одну строку, используя понимание списка, поэтому вам не нужен индекс, поскольку существует неявная взаимно-однозначная корреляция с положением узла:

p_0 = [proportion if node in source else 0.0
       for node in self.OG.nodes()]
0 голосов
/ 03 сентября 2018

Это зависит от версии networkx, которую вы используете. Подробнее здесь .

сетьx 1.x

>>> G=nx.Graph([(1,2),(3,4)])
>>> G.nodes()
[1, 2, 3, 4]

networkx 2.x

>>> G=nx.Graph([(1,2),(3,4)])
>>> G.nodes()
NodeView((1, 2, 3, 4))

Как вы можете видеть в networkx2.x, у вас нет списка, но есть NodeView.
Вы можете преобразовать в список с помощью list(G.nodes()).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...