2015-12-10 3 views
0

Мой код бросает 'Y [i] отсутствует в списке' ValueError, хотя этот список состоит из уникальных значений в Y. Я распечатал список, типы списка и тип Y [i], но не нашли решения. Кроме того, ошибка происходит нерегулярно.Невозможное значениеError. Значение не в списке при использовании numpy.unique

Чтобы обеспечить некоторый контекст: я пытаюсь написать простой фрагмент кода, который проверяет, классифицирован ли мой классификатор K-Means правильно. Поскольку средства кластера являются немаркированными ints, я хочу, чтобы мой результат был матрицей целых чисел, так что 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 

Если вы можете это исправить, вы официально удивительным.

ответ

1

Данной информации недостаточно (примеры аргументов функции, которые воспроизводят ошибку, будут полезны в следующий раз), но я подозреваю, что эта линия отвечает:

C = [V] 

вопрос заключается в том, что с [0] становится другое название V. Таким образом, всякий раз, когда линия C[h][y] += 1 выполняется при ч = 0, один элемент в V получает сходу. Следовательно, в то время как V может начаться как [np.float64(1.0), np.float64(2.0), np.float64(3.0)], он может не оставаться таким, поскольку он подвергается эрозии через цикл.

+0

Исправлено. Спасибо, ты официально классный! – Jornam

0

может быть проблемой округления, вы работаете с не целочисленными значениями. Попробуйте заменить 1.0, 2.0 ... whith 1, 2 ... и посмотреть, что произойдет

+0

Я пробовал V = map (int, V) и y = V.index (int (Y [i])), но приводит к той же проблеме – Jornam

Смежные вопросы