为何numpy和math的导入顺序会导致Pylab绘制sin(x)/|x|时报错?
问题原因分析
核心问题是from 模块 import *的导入逻辑会用后导入的同名对象覆盖先导入的同名对象,本次冲突的是sin、abs两个函数:
numpy提供的sin、abs是向量化函数,支持直接传入numpy数组做批量运算,返回值也是符合绘图要求的数组math提供的sin、abs仅支持单个数值(Python标量)作为输入,传入数组时就会抛出你遇到的TypeError: only size-1 arrays can be converted to Python scalars错误
两段代码的运行差异逻辑
- 第一段代码导入顺序:
pylab->math->numpy
最后导入的是numpy,所以当前命名空间里的sin、abs都是numpy的向量化版本,传入linspace生成的数组可以正常计算,代码运行无问题。 - 第二段代码导入顺序:
pylab->numpy->math
最后导入的是math,math模块的同名函数直接覆盖了numpy的函数,调用sin、abs时传入数组就会触发类型错误。
避坑建议
尽量不要使用import *的全局导入方式,最好明确指定模块前缀,比如导入numpy时写成import numpy as np,调用时用np.sin()、np.abs(),从根源上避免同名对象覆盖的问题。
内容的提问来源于stack exchange,提问作者Jim
相关产品推荐
相关产品推荐

