Pea*_*ful 19 python machine-learning python-3.x scikit-learn
我已经开始使用sckikit-learn来完成我的工作.所以我正在阅读教程,该教程给出了加载一些数据集的标准过程:
$ python
>>> from sklearn import datasets
>>> iris = datasets.load_iris()
>>> digits = datasets.load_digits()
Run Code Online (Sandbox Code Playgroud)
但是,为方便起见,我尝试按以下方式加载数据:
In [1]: import sklearn
In [2]: iris = sklearn.datasets.load_iris()
Run Code Online (Sandbox Code Playgroud)
但是,这会引发以下错误:
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-2-db77d2036db5> in <module>()
----> 1 iris = sklearn.datasets.load_iris()
AttributeError: 'module' object has no attribute 'datasets'
Run Code Online (Sandbox Code Playgroud)
但是,如果我使用明显相似的方法:
In [3]: from sklearn import datasets
In [4]: iris = datasets.load_iris()
Run Code Online (Sandbox Code Playgroud)
它没有问题.实际上以下也有效:
In [5]: iris = sklearn.datasets.load_iris()
Run Code Online (Sandbox Code Playgroud)
我对此完全感到困惑.我错过了一些非常微不足道的事情吗?这两种方法有什么区别?
ele*_*han 32
导入包时,只能
__init__.py直接看到该包文件中的变量/函数/类,而不是子包或模块.
datasets是一个子包sklearn.这就是为什么会这样:
In [1]: import sklearn
In [2]: sklearn.datasets
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-2-325a2bfc35d0> in <module>()
----> 1 sklearn.datasets
AttributeError: module 'sklearn' has no attribute 'datasets'
Run Code Online (Sandbox Code Playgroud)
但是,这是有效的原因:
In [3]: from sklearn import datasets
In [4]: sklearn.datasets
Out[4]: <module 'sklearn.datasets' from '/home/ethan/.virtualenvs/test3/lib/python3.5/site-packages/sklearn/datasets/__init__.py'>
Run Code Online (Sandbox Code Playgroud)
当你加载子包时datasets,from sklearn import datasets它会自动添加到包的命名空间中sklearn.这是Python导入系统中鲜为人知的"陷阱"之一.
另请注意,如果你看__init__.py的sklearn,你会看到'datasets'其中的一名成员__all__,但这只让你做:
In [1]: from sklearn import *
In [2]: datasets
Out[2]: <module 'sklearn.datasets' from '/home/ethan/.virtualenvs/test3/lib/python3.5/site-packages/sklearn/datasets/__init__.py'>
Run Code Online (Sandbox Code Playgroud)
最后要注意的一点是,如果你检查sklearn或者datasets你会看到它,虽然它们是包,但它们的类型是module.这是因为所有包都被视为模块 - 但是,并非所有模块都是包.
| 归档时间: |
|
| 查看次数: |
8495 次 |
| 最近记录: |