通过将数组分组来划分整形数组

时间:2018-12-06 10:24:09

标签: python arrays numpy split dbscan

以下两个长度相等的数组。我的目标是将数组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声明该点为离群值。 (使用的值不精确)。 我的目标是计算每个发现的簇的紧密度,...

3 个答案:

答案 0 :(得分:2)

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)

答案 1 :(得分:0)

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

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之类的奇数值,因此可以将其设置为字典的键,然后遍历字典以获取值的组,然后可以将这些值附加到最终输出数组中

答案 2 :(得分:0)

保持很简单:

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

类似地,您可以在单行代码中构建字典。