为何导入scipy后signal未定义,导入skimage后可用?求正确解法
问题
想要使用SciPy的scipy.signal.convolve2d()函数,但仅执行import scipy后调用该函数会报错:
AttributeError: module 'scipy' has no attribute 'signal'
但添加from skimage.morphology import square或from skimage.morphology import disk的导入语句后,scipy.signal却能正常定义并使用。请教该现象的原因,以及无需依赖未使用的skimage导入的正确解决方法。
相关版本信息:
scikit-image 0.19.2 py37hf11a4ad_0 anaconda scikit-learn 1.0.2 py37hf11a4ad_1 scipy 1.7.3 py37h0a974cb_0 Python 3.7.6 (default, Jan 8 2020, 20:23:39) [MSC v.1916 64 bit (AMD64)]
原因分析
- SciPy采用**延迟导入(lazy import)**机制,顶级
scipy模块不会自动加载所有子模块(比如scipy.signal),直接通过scipy.signal访问时,子模块未被初始化,因此触发AttributeError。 - 导入
skimage.morphology中的square或disk时,skimage内部代码会主动导入scipy.signal相关模块,相当于提前帮你完成了该子模块的加载,所以后续访问scipy.signal就不会报错。
正确解决方法
无需依赖skimage的导入,直接显式导入scipy.signal即可,有两种常用方式:
- 导入整个子模块:
import scipy.signal # 正常调用函数 scipy.signal.convolve2d(...)
- 直接导入目标函数:
from scipy.signal import convolve2d # 直接使用函数 convolve2d(...)
内容的提问来源于stack exchange,提问作者Flash Thunder
相关产品推荐
相关产品推荐

