Tue Nov 30 16:26:27 CET 2010

NetworkX, The Missing Graph Library

Je suis récemment tombé amoureux de Python. :) Il y a un tas de libraries cools écrites en ce langage, et j'aimerais aujourd'hui parler de networkx.

networkx est une simple librairie qui permet de jouer avec des graphes de manière agréable et pas trop lente.

Hello, World!

Commençons par un peu de code :

>>> import networkx as nx

>>> G=nx.Graph()
>>> G.add_node("spam")
>>> G.add_edge(1,2)
>>> print(G.nodes())
[1, 2, 'spam']
>>> print(G.edges())
[(1, 2)]

Extrêmement simple, non ? Si vous avez déjà utilisé une librairie pour gérer des graphes en objet, j'espère que les Factory ne vous manquent pas trop. :)

Lollipop graph

Visualisons

Il existe un tas de méthodes existantes pour générer des graphes avec des propriétés amusantes, je vais m'en servir ici pour ne pas avoir à le faire à la main.

import networkx as nx
import matplotlib.pyplot as plt

lollipop = nx.lollipop_graph(10, 3)
nx.draw(lollipop)
plt.show()
Il est bien sûr facile d'utiliser les autres formats de sortie comme dot.

Algorithmes

C'est la partie la plus intéressante de networkx en terme de gain de temps. De nombreux algos sont définis, d'autres propositions sont les bienvenues, et de manière générale ça permet de faire des trucs rapidement. PageRank est notamment implémenté, mais il existe des fonctions pour jouer avec les cliques, le clustering, les composantes connexes, les graphes bipartis, etc.

Pratique

Si vous avez un graphe dans un format particulier, c'est très facile de le lire en python, mais encore plus facile d'utiliser une méthode déjà gérée par networkx, comme GraphML.

Je me demande encore l'intérêt d'un tel article, mais dans le doute, j'ai cliqué sur "Publier". :) Je pense en tout cas networkx mérite d'être connue, étant donné la facilité avec on l'utilise et l'impression de vraiment se concentrer sur ses problèmes plutôt que sur des détails d'implémentation. Je me retrouve souvent à dire "ah, mais ça existe déjà !" et c'est plutôt bon signe.


Posted by cygal | Permanent link