使用Scipy稀疏矩阵(python)

时间:2019-02-02 16:59:58

标签: python-3.x scipy sparse-matrix adjacency-matrix boundary

我喜欢在有向邻接矩阵中查找循环。矩阵是稀疏的,在从i-> j的(i,j)有向边处包含1。没有其他边沿,并且没有一个或多个不相交的循环/循环。

最初,我有一个带有定向三角形的三角形网格,并创建了一个邻接矩阵,然后删除了内部边缘(这是通过创建一个无向的对称邻接矩阵来完成的,找到值= 2的内部边缘,然后将它们从有向网格中删除(非符号)adj矩阵)。如果网格是流形的(我之前测试过),则边界边缘将形成单独的边界环。有没有一种有效的方法可以从python的稀疏矩阵中找到所有这些循环?

想法是找到第一个非零列。获取条目索引,然后在该索引处获取列,直到我们再次到达第一个索引。记录条目将完成循环,将数据条目设置为零将从矩阵中删除此循环,然后继续下一个循环。我还考虑过将一列(起始)与矩阵迭代相乘,直到在行(起始)处获得一个条目。

def tria_get_boundary(t):
    import numpy as np
    adj = tria_get_adj(t, directed=False)
    if (np.max(adj.data) > 2):
        raise ValueError('Error: tria not manifold (edges with more than 2 triangles)!')
    if (1 not in adj.data):
        return []  
    # get directed matrix of only boundary edges
    inneredges = (adj==2)
    adj = tria_get_adj(t,directed=True)
    adj[inneredges] = 0
    adj.eliminate_zeros()
    # find loops
    firstcol = np.nonzero(adj.indptr)[0][0]-1
    loops=[]
    while not firstcol == []:
        loop = [firstcol]
        adj.data[adj.indptr[firstcol]] = 0 # visited
        ncol =adj.indices[adj.indptr[firstcol]]
        while not ncol == firstcol:
            loop.append(ncol)
            adj.data[adj.indptr[ncol]] = 0 # visited
            ncol = adj.indices[adj.indptr[ncol]]
        adj.eliminate_zeros()
        loops.append(loop)
        nz = np.nonzero(adj.indptr)[0]
        if len(nz) > 0:
            firstcol = nz[0]-1
        else:
            firstcol=[]
    return loops

这可以更有效地完成(或使用更多的pythonic方法)吗? 谢谢。

0 个答案:

没有答案