为什么我不能通过import scipy使用sp.signal作为sp?

时间:2015-10-27 22:27:11

标签: python scipy enthought

我想使用scipy.signal.ltiscipy.signal.impulse函数来计算传递函数。我按以下方式导入scipy模块。

import scipy as sp
import numpy as np
import matplotlib.pyplot as plt
from math import *

但是,当我输入以下脚本时,

tf = sp.signal.lti(numH, denH)

内核出错:

---> 10 tf = sp.signal.lti(numH, denH)
AttributeError: 'module' object has no attribute 'signal' 

我尝试了另一种导入信号模块的方法,

from scipy.signal import lti, step, impulse

然后,脚本工作,

tf = lti(numH, denH)

所以,我的问题是,我们必须导入脚本中的每个子包吗?那么导入scipy包的重点是什么?

感谢。

2 个答案:

答案 0 :(得分:1)

来自scipy doc:

  

使用任何这些子包都需要显式导入。例如,       import scipy.cluster

from scipy import cluster

做一个简单的

并没有多大意义
import scipy

查看site-packages/scipy/__init__.py文件以获取更多详细信息。将其与numpy init。

进行比较

numpy是一个集成包,scipy是一个松散集成的包的集合。 numpy是每个人都使用的基本数字包。 scipy子包相对独立。我可以加载并使用sparse,而无需了解signalintegrate个软件包。

答案 1 :(得分:1)

在python包中导入模块的默认行为在包目录的__init__.py文件中定义。您可以locate scipy目录或使用ipythonimport scipy查找此内容,并使用问号调用scipy?来获取路径。默认情况下,scipy似乎只导入numpy。信号模块是脚本目录,其中包含自己的__init__.py,因此您需要scipy.signal.lti语法。

您可以按照此question中的说明编辑__init__.py,这会减少样板导入,但可能不建议这样做,因为它会产生不可移植的代码,并可能导致名称冲突。