导入 modules/subpackages of numpy 和 Scipy 包的差异

Differences in importing modules/subpackages of numpy and Scipy packages

我正在通过 Anaconda 2.1.0 发行版使用 scipy 和 numpy。我使用 Spyder 作为我的 Python IDE.

当我运行import scipy as sp时,无法通过sp.

访问optimize、linalg、cluster等子包

但是,当我运行import numpy as np时,我能够通过np.[=18=访问它的所有子包,例如linalg、random、matrixlib、polynomial、testing等。 ]

这两个导入以不同的方式工作是否有原因?为什么 import scipy as sp 没有将所有 scipy 子包抓取到 sp 的命名空间中?

这种不同导入行为的可能性是 python 语言的设计造成的。

模块的导入语句(*)默认只导入主模块,不导入子模块。主模块可能(如 numpy 的情况),也可能不(如 scipy)导入部分或全部子模块。

scipy 说明了这背后的原因:在大多数情况下,您只需要 scipy 包的一个子模块。此默认行为不会在加载代码不需要的子模块时挂起解释器。

编辑: 请注意 numpy 默认情况下不会导入所有子模块,例如它不会加载 numpy.f2py,请参阅 THIS question/answer 了解更多详细信息。

(*) 在这里我指的是像 import scipyimport scipy as sp 这样的导入语句,其中加载了一个模块。当然如果你写import scipy.optimize那么python会先加载主模块,然后是子模块。