Массив с разделением по группам - PullRequest
0 голосов
/ 06 декабря 2018

Существуют следующие 2 массива одинаковой длины.Моя цель состоит в том, чтобы разбить массив B на группы, определенные массивом A. Таким образом, наконец, должно быть 3 массива или список массивов.Окончательный список массивов должен состоять из следующих строк массива B:

  • Первый и второй
  • Третий и пятый
  • Четвертый

Порядок на самом деле не актуален.

A = array([[-1],
           [ 1],
           [ 0],
           [ 0],
           [ 1]])

B = array([[ 624.5   ,  548.    ],
           [ 912.8201,  564.3444],
           [1564.5   ,  764.    ],
           [1463.4163,  785.9251],
           [1698.0757,  846.6306]])

Проблема возникла у меня при использовании функции кластеризации dbscan.Массив A описывает кластеры (0, 1) точек в массиве B. Значения -1 объявляют точку как выброс.(Используемые значения не являются точными).Моя цель - рассчитать компактность, ... каждого найденного кластера

Ответы [ 3 ]

0 голосов
/ 06 декабря 2018

Пакет numpy_indexed (заявление об отказе: я его автор) был разработан с учетом этих вариантов использования.

import numpy_indexed as npi
C = npi.group_by(A).split(B)

Не уверен, что вы подразумеваете под компактностью каждой группы;но вместо разделения и выполнения последующих вычислений, как правило, более эффективно вычислять сокращения по группам напрямую;посредством чего вы можете повторно использовать объект группировки для повышения эффективности:

groups = npi.group_by(A)
mean = groups.mean(B)
std = groups.std(B)
0 голосов
/ 07 декабря 2018

Хранить просто:

[data[labels == l] for l in np.unique(labels)]

Точно так же вы можете построить диктат в одну строку.

0 голосов
/ 06 декабря 2018

это немного длинно, но должно работать.

final_dict = {}
for counter in range(0,len(A)):
    if(A[counter] not in final_dict):
        final_dict[A[counter]] = B[counter]
    else:
        final_dict[A[counter]] = final_dict[A[counter]] + B[counter]

final_array = []
for key,value in final_dict.items():
        final_array.append(value)

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

...