【问题标题】:Differences in importing modules/subpackages of numpy and Scipy packagesnumpy 和 Scipy 包的导入模块/子包的区别
【发布时间】:2015-02-28 22:32:00
【问题描述】:

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

运行import scipy as sp时,无法通过sp.访问子包,如optimize、linalg、cluster等

但是,当我运行import numpy as np 时,我可以通过np 访问它的所有子包,例如linalg、random、matrixlib、多项式、测试等。

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

【问题讨论】:

  • 这确实是一个有趣的问题。有趣的是:在import scipy as sp 之后输入sp.optimize 会给你一个错误。但是如果你这样做from scipy import optimize,突然sp.optimize 不会再给你一个错误了。这个问题不是 anaconda 特有的。
  • @cel,你不会再收到错误了,因为当你输入from scipy import optimize时,解释器意识到它已经加载了主包scipy,它会导入子模块@987654333 @ 在已加载的模块中。标识符sp 指向与之前相同的模块,该模块现在已“更新”,因此您现在也可以通过标识符访问子模块optimize
  • @gg349,哦,有道理 - 不知道 :)
  • 从历史上看,numpy 是基本的集成数字包。 scipy 是独立开发的科学包合集。它们都使用numpy,但不相互依赖。

标签: python numpy import scipy


【解决方案1】:

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

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

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

编辑: 请注意numpy 默认情况下不会导入所有子模块,例如它不会加载numpy.f2py,有关详细信息,请参阅THIS 问题/答案。

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

【讨论】:

  • 谢谢。那么,在用户想要的任何标识符下加载任何模块的所有子模块的一个简单表达式是什么?
  • 肯定有办法,但这是个坏主意。只需导入您需要的模块。我想说的是,如果您事先不知道某个模块需要哪些子模块,那么您就会遇到更大的问题,因为您不知道自己在做什么
  • 你可能对this的问题感兴趣
  • 我也在尝试这样做,但我无法加载 interpolate 子模块。它说“ImportError:DLL 加载失败:找不到指定的模块。”
猜你喜欢
  • 2020-03-28
  • 2017-02-25
  • 2010-10-02
  • 2012-10-27
  • 2020-10-23
  • 2018-01-11
  • 2011-04-10
  • 2018-01-31
相关资源
最近更新 更多