Мне нужно получить группу высокой корреляции из матрицы коэффициентов корреляции, сохранить одну из них и исключить другую ... Но я не знаю, как это сделать изящно и эффективно.
Вот аналогичный ответ, но, надеюсь, это будет сделано с использованием векторной матрицы.
Объединить массивы, если они содержат одно или несколько одинаковых значений
Например:
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]