我有一个数组,其中包含分配给每个点的集群。
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]])
答案 0 :(得分:1)
很难说在不了解问题本身的情况下,您所做的事情是否是解决问题的最佳方法。
然而,可以用更少的代码获得你想要的矩阵:
x = np.array([1,1,2,3,4])
(x[None,:] == x[:,None]).astype(int)
从概念上讲,它与您的代码完全相同。它只使用了一些numpy的功能而不是python for-loops。
索引x
为x[None,:]
添加一个长度为1的虚拟轴。然后,我们利用numpy的广播功能,并在广播的阵列上逐元运算。最后,我们将布尔结果转换为整数。 (将int
替换为float
以获取浮点数。)