【问题标题】:What Scipy modules are actually calls to Numpy ones?哪些 Scipy 模块实际上是对 Numpy 模块的调用?
【发布时间】:2016-06-03 05:54:12
【问题描述】:

我很困惑,Scipy 中的某些模块实际上并不是库的一部分,而是对 Numpy 中模块的调用。

一个例子是linalg:

import scipy
scipy.linalg

这给了

AttributeError: 'module' 对象没有属性 'linalg'

另一方面,从 Scipy 调用它的正确方法是

from scipy import linalg
scipy.linalg

必须是句柄

numpy.linalg

这是如何工作的?那么从技术上讲,Numpy 和 Scipy 的区别是什么?

【问题讨论】:

  • 看看scipy/__init__.py - 它的一些导入魔法是documented there,实际上似乎有some particular magic regarding linalg
  • @LukasGraf 谢谢!所以需要显式导入是因为与 Numpy 的名称冲突?
  • @martina:不,您还需要明确导入不冲突的那些。
  • 不,我认为这不是原因。名称冲突的出现基本上是因为scipy/__init__.py 确实有from numpy import *,但后来del linalg__all__.remove('linalg') 为linalg 撤消了这一点。我无法告诉您 scipy 似乎需要为其子模块显式导入的确切原因,但它似乎适用于其中的大多数。

标签: python numpy scipy


【解决方案1】:

从 Scipy 调用它的正确方法是

from scipy import linalg
scipy.linalg

必须是句柄

numpy.linalg

不!它们是完全不同的模块。此外,它可以是import scipy.linalg,然后使用scipy.linalg,或者from scipy import linalg,然后使用linalg

如果你想判断一个 SciPy 模块是否真的来自 NumPy,最简单的方法就是交互式地查看它:

In [9]: scipy.random
Out[9]: <module 'numpy.random' from '/usr/local/lib/python2.7/dist-packages/numpy/random/__init__.pyc'>

In [10]: scipy.linalg
Out[10]: <module 'scipy.linalg' from '/usr/local/lib/python2.7/dist-packages/scipy/linalg/__init__.pyc'>

如您所见,来自numpy 的那个在输出中说numpy。这是一个 IPython 会话,但一个常规的 Python 交互式会话会说类似的话。

【讨论】:

  • 它们有什么不同?另外,为什么我的第一行代码会返回该错误?通常,如果您导入完整的库,您会访问这样的模块。
  • @martina:它们的不同之处太多了,无法一一列举。此外,您一直在做的事情的方式不是访问包的子模块的正常方式。您应该始终显式地导入子模块。为了方便起见,NumPy 只是自动导入大部分自己的子模块。如果您有更多问题,请发布新问题,而不是在 cmets 中提问。
猜你喜欢
  • 2019-03-26
  • 2018-01-11
  • 2017-09-24
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 2014-09-20
相关资源
最近更新 更多