2014-10-17 1 views
1

중복되는 값 그룹에 넣을 arrrays 목록이 있습니다. 필자의 본능은 itertools.groupby를 사용하는 것이지만 어떻게 작동하게 할 지 잘 모르겠습니다.중복 배열 그룹을 그룹화합니다.

일부 샘플 데이터 :

groups = [[a,d],[b],[c,e]] 

내가이 일을 itertools.groupby 사용할 수 : 나는 세 가지 중첩 그룹 (또는 비 연속) 배열을 끝내고 싶어

a = np.array(range(10)) 
b = np.array(range(90,100)) 
c = np.array(range(50,60)) 
d = np.array(range(8,15)) 
e = np.array(range(55,80)) 

?

for k,g in itertools.groupby([a,b,c,d,e], lambda x: SOMETHING?): 
    groups.append(list(g)) 

하지만 무엇을 정렬하고 그룹화할지 잘 모르겠습니다. 이 방법이나 다른 방법을 사용하여 어떤 제안? 감사!

업데이트 :

아래 해결책에 대해 감사합니다. 여러분은 엄청난 수의 배열이 아니므로 무차별 한 반복을 반복 할 수 있습니다. 범위의 목록이 충분히 작 으면

arrays, groups, idx = [a,b,c,d,e], [], [] 
for N,X in enumerate(arrays): 
    if N not in idx: 
    group, idx = [X], idx+[N] 
    for n,x in enumerate(arrays): 
     if n not in idx and any(np.where(np.logical_and(X<x[-1],X>x[0]))[0]): group.append(x), idx.append(n) 
    groups.append(group) 
+0

효율적인 간격 정렬은 실제로 공개 된 연구 문제입니다. 여기에 충분한 이차 방정식입니까? (5 개의 간격을 위해, 그것은 명백하게있다. ..) – abarnert

답변

0

, 당신은 단지 폭력하여이 작업을 수행 할 수 있습니다 : 나는 또한 약간의 어설픈 지능형리스트와 함께 한을 "병합", 중복에 대한 서로의 범위에 대해 각 범위를 확인하고 루프를 찾을 때마다 루프가 시작됩니다.

은 서투른 약간 단지에서 아이디어를 얻을 수 NumPy와 배열을 쓰기 때문에 (파이썬 3)의 사용하자 객체 범위하는 것입니다

def merge(x, y): 
    return range(min(x.start, y.start), max(x.stop, y.stop)) 

def overlap(x, y): 
    return x.start in y or y.start in x 

groups = {a: {a}, b: {b}, c: {c}, d: {d}, e: {e}} 

while True: 
    for key, value in groups.items(): 
     for otherkey, othervalue in groups.items(): 
      if key is otherkey: 
       continue 
      if overlap(key, otherkey): 
       del groups[otherkey] 
       del groups[key] 
       groups[merge(key, otherkey)] = value | othervalue 
       break 
     else: 
      continue 
     break 
    else: 
     break 

이 분명히 낭비 알고리즘입니다,하지만 당신이 가진 것을 고려 각 개체를 변수에 할당 할 수있는 개체가 충분하지 않습니다. 누가 신경 씁니까? 그것은 이해하기 쉽지 않을 것입니다. 그리고 그것은 아마도 여기에서 더 중요 할 것입니다.