2013-10-23 37 views
1
import KNN 
def c(i,d,l,k): 
    dss=d.shape[0] 
    dm=tile(i,(dss,1))-d 
    sqm=dm**2 
    sqd=sqm.sum(axis=1) 
    dist=sqd**0.5 
    sDI=dist.argsort() 
    clc={} 
    for i in range(k): 
     vl=l[sDI[i]] 
     clc[vl]=clc.get(vl,0)+1  
    sCC=sorted(clc.items(),key=operator.itemgetter(1),reverse=True) 
    return sCC[0][0] 

c([0,0],g,l,3) 

错误:Python的错误

Traceback (most recent call last): 
    File "<pyshell#32>", line 1, in <module> 
    c([0,0],g,l,3) 
    File "<pyshell#31>", line 12, in c 
    sCC=sorted(clc.items(),key=operator.itemgetter(1),reverse=True) 
NameError: global name 'operator' is not defined 

KNN包含以下代码:::

from numpy import * 
import operator 

def createDataSet(): 
    group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]]) 
    labels = ['A','A','B','B'] 
    return group, labels 

为什么上述有没有错误?程序在Python 3.3.2上运行。这段代码是一个简单的用Python运行的k分类算法。

+0

如果你进口KNN你也应该输入运营商。 –

回答

13

您需要将import operator放入本地命名空间; import KNN也不会导入它导入的子模块。

作为一项规则,除了builtinshttps://docs.python.org/2/library/functions.html)之外,您需要明确所使用的任何和所有模块和对象。

与其他一些语言不同,不存在隐式导入。

进口提示/编辑: 您可能想使用KNN.operator。它在那里可用,因为它是由KNN导入的。然而,这几乎总是一个令人遗憾的决定,因为混淆了这个画面:这是一个特殊的模块吗?如果是这样,它的界面是什么?保存可爱,明确。

+0

'import KNN'不会导入'operator',并将其作为'KNN.operator'使用,它只是不能使它成为'operator'。这意味着如果你真的想要写'KNN.operator.itemgetter'。但那会很愚蠢。如果你想使用'operator',它并不重要,其他模块也想使用它;只需导入它。 – abarnert

+0

@abarnert - 它确实“暴露” - 但并不像Pavan所期望的那样。 –

+1

是的,我想你已经解释得很好,可以回答OP的问题了,大多数人会用相似的问题来搜索;我只是认为这个评论可能对那些知道多一点,但还不够多的人有用。 – abarnert