我想使用scipy.signal.lti
和scipy.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
包的重点是什么?
感谢。
答案 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
,而无需了解signal
或integrate
个软件包。
答案 1 :(得分:1)
在python包中导入模块的默认行为在包目录的__init__.py
文件中定义。您可以locate
scipy目录或使用ipython
,import scipy
查找此内容,并使用问号调用scipy?
来获取路径。默认情况下,scipy
似乎只导入numpy。信号模块是脚本目录,其中包含自己的__init__.py
,因此您需要scipy.signal.lti
语法。
您可以按照此question中的说明编辑__init__.py
,这会减少样板导入,但可能不建议这样做,因为它会产生不可移植的代码,并可能导致名称冲突。