不可能的ValueError。使用numpy.unique时,值不在列表中

时间:2015-12-10 09:28:01

标签: python numpy

我的代码抛出'Y [i]不在列表中'ValueError,即使此列表由Y中的唯一值组成。我打印了列表,列表类型和Y [i]的类型但没有找到解决方案。此外,错误也不规律地发生。

提供一些上下文:我正在尝试编写一段简单的代码来检查我的K-Means分类器是否正确分类。因为聚类装置是未标记的整数,我希望我的输出是整数矩阵,使得C [h] [y]表示我的模型将X [i]分类为h,而实际标签为y的次数。因为给定的标签不一定是整数,所以我尝试通过创建可能的标签列表(V)来为它们分配整数,并使用该列表的索引而不是标签本身。

代码(包括调试打印):

    def classify(func, D):
        X = D[0]
        Y = D[1]
        V = list(np.unique(Y))    # <- V contains all values of Y
        print(V)
        print(type(V[0]),type(V[1]),type(V[2]))
        C = [V]
        for i in range(len(Y)):
            h = func(X[i])
            while len(C) < h+1:
                C.append(np.zeros(len(V)))
            if not Y[i] in V:
                print(type(Y[i]))
            y = V.index(Y[i])     # <- V does not contain Y[i]?
            C[h][y] += 1
        return np.array(C)

输出:

    [1.0, 2.0, 3.0]
    <class 'numpy.float64'> <class 'numpy.float64'> <class 'numpy.float64'>
    <class 'numpy.float64'>
    Traceback (most recent call last):
      File "leren6.py", line 38, in <module>
        main()
      File "leren6.py", line 18, in main
        C = classify(model, Data)
      File "leren6.py", line 33, in classify
        y = V.index(Y[i])
    ValueError: 3.0 is not in list

如果你能解决这个问题,你就会非常棒。

2 个答案:

答案 0 :(得分:1)

没有给出太多信息(下一次重现该bug的示例函数参数会有所帮助),但我怀疑这一行是负责的:

C = [V]

问题是C [0]成为V的另一个名称。因此,只要在h = 0时执行行C[h][y] += 1,V中的一个项目就会被破坏。因此,虽然V可能已经开始为[np.float64(1.0), np.float64(2.0), np.float64(3.0)],但它可能不会保持这种状态,因为它会在循环中被侵蚀。

答案 1 :(得分:0)

可能是舍入问题,您正在处理非整数值。尝试替换1.0,2.0 ......连接1,2 ......并看看会发生什么