in graspologic/cluster/divisive_cluster.py [0:0]
def _relabel(self, labels: np.ndarray, level: Optional[int] = None) -> np.ndarray:
# re-number "labels" so that each cluster at each level recieves
# a unique label = index of corresponding node in overall dendrogram
# assign each cluster a new label based on its index in the dendrogram
all_clusters = [node for node in LevelOrderIter(self)][1:]
for indx in range(len(all_clusters)):
all_clusters[indx]._label = indx
new_labels = labels.copy()
for lvl in range(1, self.height):
uni_paths, path_inds = np.unique(
labels[:, : lvl + 1], axis=0, return_index=True
)
for p in range(len(uni_paths)):
label_inds = (labels[:, : lvl + 1] == uni_paths[p]).all(1)
current_path = labels[path_inds[p], : lvl + 1]
cluster = self.root
current_lvl = 0
# find the cluster corresponding to "current_path"
while current_lvl <= lvl:
if not cluster.is_leaf:
cluster = cluster.children[current_path[current_lvl]]
current_lvl += 1
else:
break
new_labels[label_inds, lvl] = cluster._label
# stored to do relabeling for non-fitted data
self._labels = labels
self._new_labels = new_labels
if level is not None:
new_labels = new_labels[:, level - 1]
return new_labels