我的问题是特定于scikit-learn python模块,但我也遇到了与matplotlib类似的问题。
当我想使用sklearn时,如果我只是执行'import sklearn'然后调用我需要的任何子模块,比如'sklearn.preprocessing.scale()',我会收到错误 “AttributeError:'module'对象没有属性'预处理'”
另一方面,当我从'sklearn import preprocessing'做' 然后使用'preprocessing.scale()'它正常工作。
当我使用像Numpy这样的其他模块时,仅仅'导入numpy'就足够了,而且效果很好。
因此,我想问一下是否有人可以告诉我为什么会这样,以及我做错了什么?
感谢。
答案 0 :(得分:2)
python包在目录中的__init__.py
文件中定义。
此文件确定子模块是否包含。
执行import sklearn
时,python找到文件sklearn/__init__.py
并执行它以创建sklearn
模块。此对象绑定到名称sklearn
。 解释器不会隐式导入子模块。
然而,在执行from sklearn import preprocessing
时,python将首先像以前一样加载sklearn
模块。然后它将检查preprocessing
是否是该模块的属性(例如函数),如果不是,它将查找文件sklearn/preprocessing.py
并将该模块也压缩。
恰好numpy
在其__init__.py
文件中执行以下操作:
import .random
因此,当将numpy导入为import numpy
时,该模块的执行会触发导入numpy.random
,然后将其添加为属性。
这很有用,因为有时候你只想使用一部分包而加载所有包可能需要很长时间。例如,导入numpy
需要花费半秒钟的时间。如果您只需要一小部分功能,这就浪费了时间。
您可能有兴趣阅读documentation for packages。
答案 1 :(得分:1)
Numpy可以方便地在其__init__.py
文件中导入其子模块,并将其添加到__all__
。在使用图书馆时,你无能为力 - 无论是否成功。 sklearn显然没有。