efficient way to load a numpy adjecency matrix?
Hi, sorry for my naive question. I'd like to import hundreds of large and dense adjacency matrices available as a numpy arrays into graph_tool. The following option takes very long. Q1: Is there a preferable alternative? import graph_tool.all as gt import numpy as np adj=np.array([[1,1,0],[1,1,0],[0,0,1]]) n_vertices=adj.shape[0] g = gt.Graph(directed=False) vlist = g.add_vertex(n_vertices) edge_ids = np.where(adj !=0) for i in range(edge_ids[0].shape[0]): g.add_edge(g.vertex(edge_ids[0][i]), g.vertex(edge_ids[1][i])) Since I am dealing with undirected graphs without selfloops a first step would be to take only one triangle of the symmetric adjacency matrix: # get ids of upper triangle upper_tr = np.triu_indices_from(np.zeros((n_vertices,n_vertices))) adj[a[0],a[1]] = 0 ... Q2: is this a valid approach? Thanks in advance, Matthias
Hi, On 09/22/2011 11:43 PM, Matthias Ekman wrote:
Hi,
sorry for my naive question. I'd like to import hundreds of large and dense adjacency matrices available as a numpy arrays into graph_tool.
The following option takes very long. Q1: Is there a preferable alternative?
import graph_tool.all as gt import numpy as np
adj=np.array([[1,1,0],[1,1,0],[0,0,1]]) n_vertices=adj.shape[0]
g = gt.Graph(directed=False) vlist = g.add_vertex(n_vertices)
edge_ids = np.where(adj !=0) for i in range(edge_ids[0].shape[0]): g.add_edge(g.vertex(edge_ids[0][i]), g.vertex(edge_ids[1][i]))
Since I am dealing with undirected graphs without selfloops a first step would be to take only one triangle of the symmetric adjacency matrix:
# get ids of upper triangle upper_tr = np.triu_indices_from(np.zeros((n_vertices,n_vertices))) adj[a[0],a[1]] = 0
...
Q2: is this a valid approach?
I would do a simple loop of the form: n = adj.shape[0] for i in xrange(n): for j in xrange(i+1, n): if adj[i,j]: g.add_edge(g.vertex(i), g.vertex(j)) This has O(N^2) complexity, of course, but since your matrices are dense, there is little you can do about that. An alternative would be to perform the loop in C++ using the inline() function. This should be much faster. Cheers, Tiago -- Tiago de Paula Peixoto <tiago@skewed.de>
participants (2)
-
Matthias Ekman -
Tiago de Paula Peixoto