Pyplot绘制分段函数时x轴起始为负值触发NumPy布尔索引报错如何解决
报错核心原因
np.piecewise的分段值匹配规则为:每个分段值如果是数组形式,长度必须和对应条件掩码里True值的数量完全一致;如果是标量则无长度要求。- 原有代码中,传入的分段值
(1/100)*x*np.exp(-x/10)是基于全量x数组(固定100个元素)计算的数组:- 当x从0起始时,
x >= 0掩码全为True(共100个匹配位置),长度和计算结果完全匹配,程序可正常运行 - 当x范围改为
[-100, 100]时,x >= 0掩码仅包含约50个True值,此时将100长度的数组赋值给50个匹配位置,直接触发长度不匹配报错。
- 当x从0起始时,
修复方案
将基于全量x的直接计算,替换为可调用函数形式传入分段值。np.piecewise会自动将每个条件匹配的x子片段传入函数计算,从根源上保证返回结果长度和掩码匹配数完全一致,适配任意x范围:
y = np.piecewise( x, [x < 0, x >= 0], [ 0, # 标量,无长度匹配要求 lambda x_segment: (1/100)*x_segment*np.exp(-x_segment/10) # 接收对应区间的x子集计算 ] )
完整可运行代码
import numpy as np import matplotlib.pyplot as plt x = np.linspace(-100, 100, 100) y = np.piecewise( x, [x < 0, x >= 0], [0, lambda x_sub: (1/100)*x_sub*np.exp(-x_sub/10)] ) z = -np.exp(-x/10)*((x/10)+1)+1 plt.plot(x, y, 'r', label='test') plt.legend(loc='right') plt.show()
内容的提问来源于stack exchange,提问作者TNoms
相关产品推荐
相关产品推荐

