如何在Python中为效率数据添加更多采样点并提取采样值
解决方案:效率数据集的插值采样与数值提取
问题背景
你需要基于给定的efficiency数据集,在现有数据点之间添加密集采样点(如索引1与2之间生成1、1.2、1.5、1.7、2这类点),并提取对应数值。原代码存在变量未定义、轴逻辑混淆的问题,导致无法实现需求。
原代码问题修正
- 未定义
line变量:原代码中xdata = line.get_xdata()会直接报错,因为没有先创建绘图对象line - 轴逻辑错误:原代码将效率值作为x轴,实际应该以数据的索引位置为x轴,效率值为y轴,才能在点之间进行插值采样
实现步骤与完整代码
核心思路
- 用原始数据的索引作为x轴,效率值作为y轴建立映射
- 生成密集的采样点(自定义间隔或步长)
- 通过插值计算采样点对应的效率值
- 可视化验证并提取数值
import matplotlib.pyplot as plt import numpy as np import warnings warnings.filterwarnings('ignore') %matplotlib inline # 配置绘图尺寸 plt.rcParams["figure.figsize"] = [15, 3.50] # 1. 加载原始效率数据集 efficiency_data = np.array([ 0,0,59.02,60,56.54,56.54,62.63,61.94,61.94,62.9,59.02, 0,0,0,59.02,60,56.54,56.54,62.63,61.94,61.94,62.9,59.02, 0,0,0,59.02,60,56.54,56.54,62.63,61.94,61.94,62.9,59.02, 0,0,0,59.02,60,56.54,56.54,62.63,61.94,61.94,62.9,59.02, 0,0,0,59.02,60,56.54,56.54,62.63,61.94,61.94,62.9,59.02, 0,0,0,59.02,60,56.54,56.54,62.63,61.94,61.94,62.9,59.02,0 ]) # 原始数据的索引轴(每个数据点的位置) original_x = np.arange(len(efficiency_data)) # 2. 生成密集采样点 # 示例1:全范围按步长0.2生成采样点 dense_x = np.arange(0, len(efficiency_data), 0.2) # 示例2:仅在索引1-2之间生成指定采样点 # dense_x = np.array([1, 1.2, 1.5, 1.7, 2]) # 3. 线性插值计算采样点对应的效率值 dense_y = np.interp(dense_x, original_x, efficiency_data) # 4. 可视化对比原始数据与采样结果 plt.figure() plt.stem(original_x, efficiency_data, label='原始数据', basefmt='b-') plt.plot(dense_x, dense_y, 'ro', markersize=3, label='插值采样点') plt.xlim(0, 20) # 截取部分区间查看细节 plt.legend() plt.xlabel('数据索引') plt.ylabel('效率值') plt.title('原始数据与插值采样效果对比') plt.show() # 提取并打印采样点数值(示例:前10个点) print("采样点索引\t效率值") for x_val, y_val in zip(dense_x[:10], dense_y[:10]): print(f"{x_val:.1f}\t\t{y_val:.2f}")
进阶优化
如果需要更平滑的插值效果(而非线性插值),可以使用scipy的高阶插值方法:
from scipy.interpolate import interp1d # 创建三次插值函数 interp_func = interp1d(original_x, efficiency_data, kind='cubic') # 计算采样点数值 dense_y_cubic = interp_func(dense_x)
类DFT曲线的采样适配
若要基于采样后的效率值生成类DFT曲线,只需将插值后的dense_y代入原逻辑:
fs = 100 # 采样率 f = 8 # 信号频率 dft_like_y = np.cos(2 * np.pi * f * (dense_y / fs))
内容的提问来源于stack exchange,提问作者aparna podili
相关产品推荐
相关产品推荐

