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

attachment.html (976 Bytes)

Hi,

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