Matplotlib绘制ReLU函数时零值不显示的问题求助
解决Matplotlib绘制ReLU函数时零值不显示的问题
问题背景
尝试用Matplotlib绘制ReLU函数,但绘图时t≤0对应的零值段未显示。ReLU函数返回的是40元素的数组,单独绘制全零数组正常,但直接绘制relu(t)就缺失零值段。
初始代码
import numpy as np import matplotlib.pyplot as plt def relu(t): t[t <= 0] = 0 return t def relu_plot(): t = np.arange(-2, 2, 0.1) k = np.zeros(40) plt.plot(t, relu(t)) plt.show() print(len(relu(t))) relu_plot()
问题现象
绘图仅显示t>0时的曲线部分,t≤0的零值段完全缺失,但len(relu(t))输出为40,说明数组长度正常。
尝试更新
改用拼接数组的方式绘制时,曲线正常显示:
# 在relu_plot函数内修改 j = t[20:] # t>0的部分 k = np.concatenate((np.zeros(20), j)) plt.plot(t, k)
问题原因
问题出在ReLU函数的实现上:t[t <=0] =0直接修改了传入的原数组t。执行relu(t)后,原数组t中≤0的元素被改成0,此时plt.plot(t, relu(t))实际是在绘制(0,0), (0,0), ..., (0.1,0.1)...这样的点。Matplotlib绘制连续线时,x轴重复的点会被合并,导致零值段看起来消失了。
解决方案
方案1:创建数组副本修改
在ReLU函数中对输入数组创建副本,避免修改原数组:
def relu(t): t_copy = t.copy() t_copy[t_copy <= 0] = 0 return t_copy
方案2:使用numpy向量化函数实现
用np.maximum直接生成结果,不修改原数组:
def relu(t): return np.maximum(t, 0)
修改后重新运行relu_plot(),即可正常显示包含零值段的ReLU曲线。
内容的提问来源于stack exchange,提问作者agctute
相关产品推荐
相关产品推荐

