2014-12-21 2 views
0

그래프 이론 방법을 이미지 처리 문제에 적용하려고합니다. 내가 그래프로 나타내려는 점을 포함하는 배열로부터 인접 행렬을 생성하고 싶습니다. 배열에있는 점의 전체 그래프를 생성하려고합니다. 그래프에 배열에 N 포인트가 있으면 NxN 매트릭스가 필요합니다. 가중치는 점 사이의 거리를해야한다, 그래서 이것은 내가 가지고있는 코드 :Python의 배열에서 압축 된 희소 매트릭스를 벡터화합니다.

''' vertexarray is an array where the points that are to be 
    included in the complete graph are True and all others False.''' 

import numpy as np 
def array_to_complete_graph(vertexarray): 

    vertcoords = np.transpose(np.where(vertexarray == True)) 

    cg_array = np.eye(len(vertcoords)) 

    for idx, vals in enumerate(vertcoords): 
     x_val_1, y_val_1 = vals 
     for jdx, wals in enumerate(vertcoords): 
      x_diff = wals[0] - vals[0] 
      y_diff = wals[1] - vals[1] 
      cg_array[idx,jdx] = np.sqrt(x_diff**2 + y_diff**2) 
    return cg_array 

이것은 물론 작동하지만, 내 질문은 :이 같은 배열은 루프의 중첩없이 생성 할 수 있습니까?

답변

0

기능 scipy.spatial.distance.cdist() 사용

import numpy as np 

def array_to_complete_graph(vertexarray): 

    vertcoords = np.transpose(np.where(vertexarray == True)) 

    cg_array = np.eye(len(vertcoords)) 

    for idx, vals in enumerate(vertcoords): 
     x_val_1, y_val_1 = vals 
     for jdx, wals in enumerate(vertcoords): 
      x_diff = wals[0] - vals[0] 
      y_diff = wals[1] - vals[1] 
      cg_array[idx,jdx] = np.sqrt(x_diff**2 + y_diff**2) 
    return cg_array 

arr = np.random.rand(10, 20) > 0.75 

from scipy.spatial.distance import cdist 
y, x = np.where(arr) 
p = np.c_[x, y] 
dist = cdist(p, p) 
np.allclose(array_to_complete_graph(arr), dist) 
+0

믿을 수 없을 정도로 빨랐다. 정말 고맙습니다. 나는 내가 투표하기에 불충분 한 평판을 가지고 있다는 것을 유감스럽게 생각한다. 다시 감사합니다. – carsonc

관련 문제