2017-04-11 91 views
-1

我即将在sklearn中混淆Adaboost,但我只是想澄清一点我在概念上的差异。导入包裹混淆

我已阅读通过this堆栈溢出文章。我还通过其他一些堆栈文章,带有奇怪的导入错误。不过,我仍然有点困惑,为什么这些代码片段中的一个工作正常,而另一个则中断。

基本上,我只是搞乱用不同的方式导入sklearn.ensemble。我想,因为sklearn是一个包,我们可以这样做:

import sklearn 
clf = sklearn.ensemble.AdaBoostClassifier 
AttributeError: 'module' object has no attribute 'ensemble' 

该错误告诉我,合奏不是一个属性。我想这是有道理的,因为合奏本身就是一个包装。

这个代码文档片断工作,但:

import sklearn.ensemble 
clf = sklearn.ensemble.AdaBoostClassifier 

我的问题是,是什么区别?如果我们导入一个软件包,在超级软件包中引用软件包不是很好吗?为什么这不被允许?随意链接我的文档,但我不知道最好的地方看。

谢谢!

+0

可能的重复https://stackoverflow.com/questions/8899198/module-has-no-attribute –

回答

1

当单独使用时,import关键字总是跟着一个模块,而不是一个包:

import my_module 

如果你想在一个包中导入生活中的模块,你可以使用点符号导入模块:

import my_package.my_module 

混淆的产生是由于一个包的名称也可以被用作名称为封装内的模块__init__.py。 当你import sklearn,你不是import所有的包内容,但只有模块sklearn.__init__.py

因此:

import sklearn #imports the contents of sklearn.__init__.py 
import sklearn.ensemble # imports the contents of sklearn.ensemble.py 

另一种方式进口的东西是构建

from <module> import <attributes> 

在这种情况下,类似的规则适用:from键盘后跟一个模块,而不是一个包。所以,如果

from sklearn import an_awesome_function 

然后要导入的模块sklearn.__init__.py,这是包sklearn的一部分定义an_awesome_function