实现numpy bincount来更改最常见值的一半?

时间:2019-04-11 02:16:13

标签: numpy

我正在使用numpy实现KMeans算法。

我正在创建一个名为distance的numpy数组,如下所示:

[[ 5.  1.  1.  1.  2.  1.  3.  1.  1.  1.]
 [ 5.  4.  4.  5.  7. 10.  3.  2.  1.  0.]
 [ 3.  1.  1.  1.  2.  2.  3.  1.  1.  1.]
 [ 6.  8.  8.  1.  3.  4.  3.  7.  1.  1.]
 [ 4.  1.  1.  3.  2.  1.  3.  1.  1.  1.]
 [ 8. 10. 10.  8.  7. 10.  9.  7.  1.  0.]
 [ 1.  1.  1.  1.  2. 10.  3.  1.  1.  0.]
 [ 2.  1.  2.  1.  2.  1.  3.  1.  1.  1.]
 [ 2.  1.  1.  1.  2.  1.  1.  1.  5.  1.]
 [ 4.  2.  1.  1.  2.  1.  2.  1.  1.  1.]]

其中前9列是数据点,最后一列是为初始化的随机质心分配的数据点簇。

在此数组中,我想在最后一列中看到这些值0,1,2。就像上面的给定数组一样,我们在最后一列只能看到0,1。在这种情况下,我打算将最常用值的一半从最后一列更改为2。

k=3
for c in range(k):
    if c in distances[:, -1]:
    else:
        x = np.bincount(distances[:,-1]).argmax()
        distances[:len(distances[distances[:,-1]==x])/2,-1][distances[:,-1] == x] = c

但是这不起作用。有人可以帮我解决这个问题吗?

错误-> IndexError:布尔索引与沿维度0的索引数组不匹配;维度为0,但相应的布尔维度为10

1 个答案:

答案 0 :(得分:1)

我认为这可能对您有帮助

如果distance是具有数组

的变量
x=np.unique(distance[:,-1]).argmax()
pos=np.argwhere(distance[:,-1]==x).flatten()
for i in range(int(len(pos)/2)):
    distance[i,-1]=2

我希望这会有所帮助!