假设有一个一维数组,但是此数组中只有部分位置上有值,其它位置数据缺失,现在想用线性插值的方法将其填充。
示例代码:
import numpy as np
# 假设你有一个长度为171的数组,名为full_data,其中有13个数据点
# 用 None 表示缺失的数据点
full_data = [None] * 171
# 假设你已经有了13个数据点的索引和值
known_indices = [11, 21, 31, 41, 51, 61, 71, 81, 91, 101, 121, 141, 161]
known_values = [0.207, 0.217, 0.184, 0.177, 0.162, 0.312,
0.253, 0.317, 0.333, 0.336, 0.352, 0.288, 0.295]
# 使用 NumPy 的interp函数进行线性插值
# 注意:interp函数要求已知数据点的索引必须是单调递增的
# 这里假设已知索引是单调递增的
full_indices = np.arange(len(full_data))
full_data = np.interp(full_indices, known_indices, known_values)
# 打印结果
print(full_data)
结果展示:
[0.207 0.207 0.207 0.207 0.207 0.207 0.207 0.207 0.207
0.207 0.207 0.207 0.208 0.209 0.21 0.211 0.212 0.213
0.214 0.215 0.216 0.217 0.2137 0.2104 0.2071 0.2038 0.2005
0.1972 0.1939 0.1906 0.1873 0.184 0.1833 0.1826 0.1819 0.1812
0.1805 0.1798 0.1791 0.1784 0.1777 0.177 0.1755 0.174 0.1725
0.171 0.1695 0.168 0.1665 0.165 0.1635 0.162 0.177 0.192
0.207 0.222 0.237 0.252 0.267 0.282 0.297 0.312 0.3061
0.3002 0.2943 0.2884 0.2825 0.2766 0.2707 0.2648 0.2589 0.253
0.2594 0.2658 0.2722 0.2786 0.285 0.2914 0.2978 0.3042 0.3106
0.317 0.3186 0.3202 0.3218 0.3234 0.325 0.3266 0.3282 0.3298
0.3314 0.333 0.3333 0.3336 0.3339 0.3342 0.3345 0.3348 0.3351
0.3354 0.3357 0.336 0.3368 0.3376 0.3384 0.3392 0.34 0.3408
0.3416 0.3424 0.3432 0.344 0.3448 0.3456 0.3464 0.3472 0.348
0.3488 0.3496 0.3504 0.3512 0.352 0.3488 0.3456 0.3424 0.3392
0.336 0.3328 0.3296 0.3264 0.3232 0.32 0.3168 0.3136 0.3104
0.3072 0.304 0.3008 0.2976 0.2944 0.2912 0.288 0.28835 0.2887
0.28905 0.2894 0.28975 0.2901 0.29045 0.2908 0.29115 0.2915 0.29185
0.2922 0.29255 0.2929 0.29325 0.2936 0.29395 0.2943 0.29465 0.295
0.295 0.295 0.295 0.295 0.295 0.295 0.295 0.295 0.295 ]
线性插值绘图代码:
import matplotlib.pyplot as plt
import numpy as np
# 数据
x = [11, 21, 31, 41, 51, 61, 71, 81, 91, 101, 121, 141, 161]
y = [0.207, 0.217, 0.184, 0.177, 0.162, 0.312,
0.253, 0.317, 0.333, 0.336, 0.352, 0.288, 0.295]
x1 = np.arange(0, 171)
y1 = [0.207, 0.207, 0.207, 0.207, 0.207, 0.207, 0.207, 0.207, 0.207,
0.207, 0.207, 0.207, 0.208, 0.209, 0.21, 0.211, 0.212, 0.213,
0.214, 0.215, 0.216, 0.217, 0.2137, 0.2104, 0.2071, 0.2038, 0.2005,
0.1972, 0.1939, 0.1906, 0.1873, 0.184, 0.1833, 0.1826, 0.1819, 0.1812,
0.1805, 0.1798, 0.1791, 0.1784, 0.1777, 0.177, 0.1755, 0.174, 0.1725,
0.171, 0.1695, 0.168, 0.1665, 0.165, 0.1635, 0.162, 0.177, 0.192,
0.207, 0.222, 0.237, 0.252, 0.267, 0.282, 0.297, 0.312, 0.3061,
0.3002, 0.2943, 0.2884, 0.2825, 0.2766, 0.2707, 0.2648, 0.2589, 0.253,
0.2594, 0.2658, 0.2722, 0.2786, 0.285, 0.2914, 0.2978, 0.3042, 0.3106,
0.317, 0.3186, 0.3202, 0.3218, 0.3234, 0.325, 0.3266, 0.3282, 0.3298,
0.3314, 0.333, 0.3333, 0.3336, 0.3339, 0.3342, 0.3345, 0.3348, 0.3351,
0.3354, 0.3357, 0.336, 0.3368, 0.3376, 0.3384, 0.3392, 0.34, 0.3408,
0.3416, 0.3424, 0.3432, 0.344, 0.3448, 0.3456, 0.3464, 0.3472, 0.348,
0.3488, 0.3496, 0.3504, 0.3512, 0.352, 0.3488, 0.3456, 0.3424, 0.3392,
0.336, 0.3328, 0.3296, 0.3264, 0.3232, 0.32, 0.3168, 0.3136, 0.3104,
0.3072, 0.304, 0.3008, 0.2976, 0.2944, 0.2912, 0.288, 0.28835, 0.2887,
0.28905, 0.2894, 0.28975, 0.2901, 0.29045, 0.2908, 0.29115, 0.2915, 0.29185,
0.2922, 0.29255, 0.2929, 0.29325, 0.2936, 0.29395, 0.2943, 0.29465, 0.295,
0.295, 0.295, 0.295, 0.295, 0.295, 0.295, 0.295, 0.295, 0.295]
# 绘制折线图
plt.scatter(x, y, color='red', label='pre-interpolation')
plt.plot(x, y, color='pink')
# dashes设置虚线与虚线之间的间隔
plt.plot(x1, y1, alpha=1, linestyle='--',
color='blue', dashes=(10, 10), label='post-interpolation')
# 添加标题和标签
plt.xlabel('X-axis')
plt.ylabel('Y-axis')
plt.legend()
# 显示图形
plt.show()
结果展示:
从图片可以看出,线性插值即是将两点连成直线,插值的数据即是直线上的数据。