Numpy 通过分组数组拆分数组

Numpy split array by grouping array

有以下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 数组描述了数组 B 中点的簇 (0, 1)。值 -1 声明该点为异常值。 (使用的值不精确)。 我的目标是计算紧凑度,...每个找到的集群

这有点冗长,但应该可以。

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 这样的奇数值可以使用,你可以将它设置为字典的键,然后遍历字典以获得值组,然后你可以将这些值附加到最终的输出数组

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)

保持简单:

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

同样,您可以在一行中构建字典。