使用Matplotlib绘制含模条件函数遇ValueError,求解决方法
解决Matplotlib绘制分段函数时的ValueError问题
你的问题出在函数f(x)是为单个数值设计的,但传入的x是numpy数组,导致条件判断返回布尔数组,if语句无法解析其真值。下面提供几种可行的解决方法:
方法1:使用np.vectorize包装函数
np.vectorize可以将处理单个元素的函数转换为能处理数组的函数,本质是遍历数组元素逐个计算:
import numpy as np from matplotlib import pyplot as plt plt.rcParams["figure.figsize"] = [7.50, 3.50] plt.rcParams["figure.autolayout"] = True def f(x): floor_val = np.floor(x / 3) mod_val = floor_val % 3 if mod_val == 1: return -x + 2 + 4 * floor_val elif mod_val == 2: return x - 2 * np.floor((x + 1) / 3) else: # mod_val ==0 return x - 2 * floor_val # 包装函数使其支持数组输入 f_vec = np.vectorize(f) x = np.linspace(-10, 10, 100) plt.plot(x, f_vec(x), color='blue') plt.show()
方法2:完全向量化操作(推荐)
利用numpy的布尔索引直接对数组进行批量处理,避免循环,效率更高:
import numpy as np from matplotlib import pyplot as plt plt.rcParams["figure.figsize"] = [7.50, 3.50] plt.rcParams["figure.autolayout"] = True def f(x): floor_val = np.floor(x / 3) mod_val = floor_val % 3 # 初始化结果数组 res = np.zeros_like(x) # 布尔索引匹配各条件并赋值 mask1 = mod_val == 1 res[mask1] = -x[mask1] + 2 + 4 * floor_val[mask1] mask2 = mod_val == 2 res[mask2] = x[mask2] - 2 * np.floor((x[mask2] + 1) / 3) mask0 = mod_val == 0 res[mask0] = x[mask0] - 2 * floor_val[mask0] return res x = np.linspace(-10, 10, 100) plt.plot(x, f(x), color='blue') plt.show()
方法3:列表推导式逐个处理元素
手动遍历数组元素,计算后转为numpy数组:
import numpy as np from matplotlib import pyplot as plt plt.rcParams["figure.figsize"] = [7.50, 3.50] plt.rcParams["figure.autolayout"] = True def f(x): floor_val = np.floor(x / 3) mod_val = floor_val % 3 if mod_val == 1: return -x + 2 + 4 * floor_val elif mod_val == 2: return x - 2 * np.floor((x + 1) / 3) else: return x - 2 * floor_val x = np.linspace(-10, 10, 100) # 逐个处理x中的元素 y = np.array([f(val) for val in x]) plt.plot(x, y, color='blue') plt.show()
注意:方法1和3本质是循环处理元素,数据量较大时推荐方法2的向量化操作,这也是numpy的最优实践。
内容的提问来源于stack exchange,提问作者tcb93
相关产品推荐
相关产品推荐

