def smatrix_from_nd_idx(idx, nn=0): """Create a sparse adjacency matrix from nd index system Parameters ---------- idx:array of shape (n_samples, dim), type int indexes of certain positions in a nd space nn: int, optional nd neighboring system, unused at the moment Returns ------- coo_mat: a sparse coo matrix, adjacency of the neighboring system """ n = idx.shape[0] dim = idx.shape[1] nidx = idx - idx.min(0) eA = [] eB = [] # compute the edges in each possible direction for d in range(dim): mi = nidx.max(0) + 2 a = np.hstack((1, np.cumprod(mi[:dim - 1]))) v1 = np.dot(nidx, a) assert(np.size(v1) == np.size(np.unique(v1))) o1 = np.argsort(v1) sv1 = v1[o1] nz = np.squeeze(np.nonzero(sv1[:n - 1] - sv1[1:] == - 1)) nz = np.reshape(nz, np.size(nz)) eA.append(o1[nz]) eB.append(o1[nz + 1]) nidx = np.roll(nidx, 1, 1) eA = np.concatenate(eA) eB = np.concatenate(eB) E = 2 * np.size(eA) # create a graph structure if E == 0: return sp.coo_matrix((n, n)) edges = np.vstack((np.hstack((eA, eB)), np.hstack((eB, eA)))).T weights = np.ones(E) G = WeightedGraph(n, edges, weights) return G.to_coo_matrix()
def smatrix_from_nd_idx(idx, nn=0): """Create a sparse adjacency matrix from nd index system Parameters ---------- idx:array of shape (n_samples, dim), type int indexes of certain positions in a nd space nn: int, optional nd neighboring system, unused at the moment Returns ------- coo_mat: a sparse coo matrix, adjacency of the neighboring system """ n = idx.shape[0] dim = idx.shape[1] nidx = idx - idx.min(0) eA = [] eB = [] # compute the edges in each possible direction for d in range(dim): mi = nidx.max(0) + 2 a = np.hstack((1, np.cumprod(mi[:dim - 1]))) v1 = np.dot(nidx, a) assert (np.size(v1) == np.size(np.unique(v1))) o1 = np.argsort(v1) sv1 = v1[o1] nz = np.squeeze(np.nonzero(sv1[:n - 1] - sv1[1:] == -1)) nz = np.reshape(nz, np.size(nz)) eA.append(o1[nz]) eB.append(o1[nz + 1]) nidx = np.roll(nidx, 1, 1) eA = np.concatenate(eA) eB = np.concatenate(eB) E = 2 * np.size(eA) # create a graph structure if E == 0: return sp.coo_matrix((n, n)) edges = np.vstack((np.hstack((eA, eB)), np.hstack((eB, eA)))).T weights = np.ones(E) G = WeightedGraph(n, edges, weights) return G.to_coo_matrix()
def topology(self): """returns a sparse matrix that represents the connectivity in self """ E = len(self.triangles) edges = np.zeros((3 * E, 2)) weights = np.zeros(3 * E) for i in range(E): sa, sb, sc = self.triangles[i] edges[3 * i] = np.array([sa, sb]) edges[3 * i + 1] = np.array([sa, sc]) edges[3 * i + 2] = np.array([sb, sc]) G = WeightedGraph(self.V, edges, weights) # symmeterize the graph G.symmeterize() # remove redundant edges G = G.cut_redundancies() # make it a metric graph G.set_euclidian(self.coord) return G.to_coo_matrix()
def topology(self): """Returns a sparse matrix that represents the connectivity in self """ E = len(self.triangles) edges = np.zeros((3 * E, 2)) weights = np.ones(3 * E) for i in range(E): sa, sb, sc = self.triangles[i] edges[3 * i] = np.array([sa, sb]) edges[3 * i + 1] = np.array([sa, sc]) edges[3 * i + 2] = np.array([sb, sc]) G = WeightedGraph(self.V, edges, weights) # symmeterize the graph G = G.symmeterize() # remove redundant edges G = G.cut_redundancies() # make it a metric graph G.set_euclidian(self.coord) return G.to_coo_matrix()
import numpy as np from numpy.random import randn, rand import matplotlib.pylab as mp from nipy.algorithms.graph import WeightedGraph from nipy.algorithms.clustering.hierarchical_clustering import ward # n = number of points, k = number of nearest neighbours n = 100 k = 5 verbose = 0 X = randn(n, 2) X[:np.ceil(n / 3)] += 3 G = WeightedGraph(n) G.knn(X, 5) tree = ward(G, X, verbose) threshold = .5 * n u = tree.partition(threshold) mp.figure(figsize=(12, 6)) mp.subplot(1, 3, 1) for i in range(u.max()+1): mp.plot(X[u == i, 0], X[u == i, 1], 'o', color=(rand(), rand(), rand())) mp.axis('tight') mp.axis('off') mp.title('clustering into clusters \n of inertia < %g' % threshold)