Объединение массивов, содержащих одинаковые значения - PullRequest
0 голосов
/ 09 сентября 2018

Мне нужно получить группу высокой корреляции из матрицы коэффициентов корреляции, сохранить одну из них и исключить другую ... Но я не знаю, как это сделать изящно и эффективно.

Вот аналогичный ответ, но, надеюсь, это будет сделано с использованием векторной матрицы. Объединить массивы, если они содержат одно или несколько одинаковых значений

Например:

a = np.array([[1,0,0,0,0,1],
              [0,1,0,1,0,0],
              [0,0,1,0,1,1],
              [0,1,0,1,0,0],
              [0,0,1,0,1,0],              
              [1,0,1,0,0,1]])

Диагональ:

(0,0),(1,1),(2,2)...(5,5)

Другое:

(0,5),(1,3),(2,4),(2,5)

Эти три пары, потому что друг с другом объединены в группу:

(0,2,4,5) = (0,5),(2,4),(2,5)

Так что в конечном итоге мне нужен вывод: (Я буду использовать результаты для индексации других данных и, следовательно, решу сохранить самый большой индекс в каждой группе)

out = [(0,2,4,5),(1,3)]

Я думаю, что самый простой подход - это взять вложенный цикл и пройти по всем элементам несколько раз. Я хотел бы иметь более краткий и эффективный способ достижения, спасибо

Это реализация цикла, извините, что пишу трудно, чтобы увидеть:

a = np.array([[1,0,0,0,0,1],
              [0,1,0,1,0,0],
              [0,0,1,0,1,1],
              [0,1,0,1,0,0],
              [0,0,1,0,1,0],              
              [1,0,1,0,0,1]])

a[np.tril_indices(6, -1)]= 0     
a[np.diag_indices(6)]    = 0     
g = list(np.c_[np.where(a)])

p = {}; index = 1
while len(g)>0:
    x = g.pop(0)
    if not p:
        p[index] = list(x)
        for i,l in enumerate(g):
            if np.in1d(l,x[0]).any()|np.in1d(l,x[1]).any():
                n = list(g.pop(i))
                p[index].extend(n)
    else:
        T = False
        for key,v in p.items():
            if np.in1d(v,x[0]).any()|np.in1d(v,x[1]).any():
                v.extend(list(x))
                T = True
        if T==False:
            index += 1; p[index] = list(x)
            for i,l in enumerate(g):
                if np.in1d(l,x[0]).any()|np.in1d(l,x[1]).any():
                    n = list(g.pop(i))
                    p[index].extend(n)

for key,v in p.items():
    print key,np.unique(v)

из

1 [0 2 4 5]
2 [1 3]

1 Ответ

0 голосов
/ 28 сентября 2018

Центральная проблема объединения / объединения пар с общими экстремумами может быть решена с помощью этого ответа .

Следовательно, приведенный выше код можно переписать так:

a = np.array([[1,0,0,0,0,1],
              [0,1,0,1,0,0],
              [0,0,1,0,1,1],
              [0,1,0,1,0,0],
              [0,0,1,0,1,0],              
              [1,0,1,0,0,1]])

a[np.tril_indices(6, -1)]= 0     
a[np.diag_indices(6)]    = 0     
g = np.c_[np.where(a)].tolist()

def consolidate(items):
    items = [set(item.copy()) for item in items]
    for i, x in enumerate(items):
        for j, y in enumerate(items[i + 1:]):
            if x & y:
                items[i + j + 1] = x | y
                items[i] = None
    return [sorted(x) for x in items if x]

p = {i + 1: x for i, x in enumerate(sorted(consolidate(g)))}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...