python — не может вызвать функцию в скрипте, но может в интерактивном режиме

#python #numpy

#python #numpy

Вопрос:

Это простая задача о kNN, и я новичок в pyhton.

 # coding=utf-8
from numpy import *
import operator


def createDataSet():
    group = array([[112, 110], [128, 162], [83, 206], [142, 267], [188, 184], [218, 268], [234, 108], [256, 146], [
                  333, 177], [350, 86], [364, 237], [378, 117], [409, 147], [485, 130], [326, 344], [387, 326], [378, 435], [434, 375]])
    labels = [1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3]
    return group, labels


def classify0(inX, dataSet, labels, k):
    dataSetSize = dataSet.shape[0]
    tempSet = array(tile(inX, (dataSetSize, 1)))
    diffMat = tempSet - dataSet
    sqDiffMat = diffMat**2
    sqDistances = sqDiffMat.sum(axis=1)
    distances = sqDistances**0.5
    sortedDistIndices = distances.argsort()

    classCount = {}
    for i in range(k):
        voteLabel = labels[sortedDistIndices[i]]
        classCount[voteLabel] = classCount.get(voteLabel, 0)   1

    sortedClassCount = sorted(classCount.iteritems(),
                              key=operator.itemgetter(1), reverse=True)
    return sortedClassCount[0][0]

# TRY1
# def with_intput():
#     sample = array(raw_input('Enter you data:'))
#     group, labels = createDataSet()
#     sampleClass = classify0(sample, group, labels, 3)
#     print sampleClass
# with_intput()
# TRY1

# TRY2
# sample = array(raw_input('Enter your sample data:'))
# group, labels = createDataSet()
# sampleClass = classify0(sample, group, labels, 3)
# print sampleClass
# TRY2
  

Есть что-то действительно странное. Я создал функцию с именем classify0() , но если я вызову ее во время написания кодов (раскомментирую #TRY1) или использую ее для проверки (если раскомментирую #TRT2), она вернет ошибку при запуске этого файла.

Появляется нравится:

 TypeError: ufunc 'subtract' did not contain a loop with signature matching types dtype('S11') dtype('S11') dtype('S11')
  

Вот трассировка TRY1:

 Traceback (most recent call last):
  File "C:UserszhongzhengDesktopML_Codetemp2.py", line 39, in <module>
    with_intput()
  File "C:UserszhongzhengDesktopML_Codetemp2.py", line 36, in with_intput
    sampleClass = classify0(sample, group, labels, 3)
  File "C:UserszhongzhengDesktopML_Codetemp2.py", line 17, in classify0
    diffMat = tempSet - dataSet
TypeError: ufunc 'subtract' did not contain a loop with signature matching types dtype('S11') dtype('S11') dtype('S11')
  

И трассировка TRY2:

 Traceback (most recent call last):
  File "C:UserszhongzhengDesktopML_Codetemp2.py", line 46, in <module>
    sampleClass = classify0(sample, group, labels, 3)
  File "C:UserszhongzhengDesktopML_Codetemp2.py", line 17, in classify0
    diffMat = tempSet - dataSet
TypeError: ufunc 'subtract' did not contain a loop with signature matching types dtype('S11') dtype('S11') dtype('S11')
  

Но если я сохраню файл без раскомментирования TRT1 или TRY2, сохраните и запустите файл только с двумя функциями в нем, затем введите эти команды построчно в интерактивном режиме в cmd или ipython:

 >>>group,labels = createDataSet()
>>>sampleClass = classify0(array([111,111]), group, labels, 3)
>>>print sampleClass
  

Это будет работать просто отлично.

Не могу понять, почему.

Еще один вопрос, почему мой sublime3 (subliemlinter, установлен pep8linter) продолжает предупреждать from numpy import * или import numpy или import numpy as np неправильно.

Спасибо за ваше терпение.

Комментарии:

1. Можете ли вы включить обратную трассировку?

2. Ответ на ваш «еще один вопрос» заключается в том, что обычно вы не хотите import * использовать такой модуль, как numpy — это затрудняет понимание того, какие numpy функции вы на самом деле используете, и вы можете затенять встроенные имена.

3. Извините, я слишком легкомысленный. @JoseRaulBarreras

4. Спасибо, я понимаю! Мой sublime 3 не предупреждал об использовании `import numpy’ и ‘import numpy as np’, просто предупредил, что я не использовал их после импорта. @exp1orer

Ответ №1:

Ваш raw_input не принимает то, что вы ожидаете, в качестве входных данных для функции classify0.

 sample = array(raw_input('Enter you data:'))
  

Это даст что-то вроде [«111 111»]

 sample = [int(x) for x in raw_input().split()]
  

Это дало бы [111,111]

Вы также можете изменить разделитель на split on , т. Е. Использовать a , если ввод разделен запятой