Python绘制Dirac Delta函数出现数组真值歧义报错如何解决
报错原因
你定义的ddf函数原本是为单个数值输入设计的,但调用时传入的X是长度为1000的Numpy数组,Python原生的if判断无法直接对包含多个元素的数组做整体布尔真值判定,因此触发该错误。
修复方案
推荐将ddf函数改为Numpy向量化实现,不需要遍历数组元素,直接对整个数组做运算即可,修改后的完整代码如下:
from __future__ import division import numpy as np import matplotlib.pyplot as plt def ddf(x,sig): # 用np.where实现向量化条件判断 val = np.where((x >= -(1/(2*sig))) & (x <= (1/(2*sig))), sig, 0) return val X=np.linspace(-5,5,1000) for sig in np.arange(1,5,0.1): plt.cla() plt.grid() plt.title('Dirac Delta function',size=20) plt.xlabel('X values',size=10) plt.ylabel("Dirac Delta functions' values",size=10) plt.ylim(0,1) plt.plot(X,ddf(X,sig),color='black') plt.pause(0.5) plt.show()
改动说明
- 替换了原生的
if-else分支,改用Numpy内置的np.where函数实现向量化条件判断,支持直接传入数组运算 - 条件判断中的逻辑与从
and改为&,符合Numpy数组的布尔运算规则
如果不想修改原有函数逻辑,也可以用np.vectorize对函数做包装,只需在函数定义前加一行装饰器即可:
@np.vectorize def ddf(x,sig): if -(1/(2*sig))<=x and x<=(1/(2*sig)): val=sig else: val=0 return val
不过这种方式本质是隐式遍历数组元素,运行效率比直接用np.where的向量化实现低,更推荐第一种修改方案。
内容的提问来源于stack exchange,提问作者Lusypher
相关产品推荐
相关产品推荐

