具有聚类分配的数组的重合矩阵

时间:2015-03-13 08:55:53

标签: python numpy

我有一个数组,其中包含分配给每个点的集群。

import numpy as np
cluster_labels = np.array([1,1,2,3,4])

我怎样才能得到像这样的矩阵:

1 1 0 0 0 
1 1 0 0 0 
0 0 1 0 0 
0 0 0 1 0 
0 0 0 0 1

我确信有一些聪明的东西:

import numpy as np

cluster_labels = np.array([1,1,2,3,4])
n = cluster_labels.shape[0]
pairwise_clustering = np.zeros((n, n))

for i in xrange(n):
    for j in xrange(n):
        if cluster_labels[i] == cluster_labels[j]:
            pairwise_clustering[i,j] = 1

print pairwise_clustering


[[ 1.  1.  0.  0.  0.]
 [ 1.  1.  0.  0.  0.]
 [ 0.  0.  1.  0.  0.]
 [ 0.  0.  0.  1.  0.]
 [ 0.  0.  0.  0.  1.]]

修改(奖金): 我对一组$ n $ cluster_labels的平均成对聚类感兴趣。所以我想直接从许多cluster_labels的数组中得到pairwise_clustering的意思:

n_cluster_labels = np.array([[1,1,2,3,4],
                             [1,2,3,3,4],
                             [1,1,2,3,4]])

1 个答案:

答案 0 :(得分:1)

很难说在不了解问题本身的情况下,您所做的事情是否是解决问题的最佳方法。

然而,可以用更少的代码获得你想要的矩阵:

x = np.array([1,1,2,3,4])
(x[None,:] == x[:,None]).astype(int)

从概念上讲,它与您的代码完全相同。它只使用了一些numpy的功能而不是python for-loops。

索引xx[None,:]添加一个长度为1的虚拟轴。然后,我们利用numpy的广播功能,并在广播的阵列上逐元运算。最后,我们将布尔结果转换为整数。 (将int替换为float以获取浮点数。)