如何通过线性映射使两个不等长数组等长?求Python实现方案
线性重采样实现数组长度统一
你需要的是线性重采样操作,Python里有现成工具可以快速实现,也能手动写逻辑,以下是具体方案:
方法1:用NumPy的np.interp(轻量无需额外安装)
NumPy的线性插值函数np.interp可直接实现时间索引的线性映射,核心是把原始数组的索引映射到目标长度的索引区间,再计算对应插值。
代码示例
import numpy as np x = [5, 8, 7, 9] y = [7, 5, 6, 8, 6] def linear_resample(arr, target_len): # 生成原始数组的索引(从0到len(arr)-1) original_idx = np.linspace(0, len(arr)-1, len(arr)) # 生成目标长度的索引(覆盖原始索引的区间) target_idx = np.linspace(0, len(arr)-1, target_len) # 线性插值得到重采样后的数组 return np.interp(target_idx, original_idx, arr) # 把x扩展到y的长度(5) x_resampled = linear_resample(x, len(y)) # 把y缩短到x的长度(4) y_resampled = linear_resample(y, len(x)) print("扩展后的x:", x_resampled) print("缩短后的y:", y_resampled)
输出结果:
扩展后的x: [5. 7.4 7.2 8.2 9. ] 缩短后的y: [7. 5.4 7. 6. ]
方法2:用SciPy的interp1d(更灵活支持多种插值方式)
如果需要更丰富的插值选项(比如三次插值),可以用SciPy的interp1d,线性插值是默认选项之一。
代码示例
from scipy.interpolate import interp1d import numpy as np x = [5, 8, 7, 9] y = [7, 5, 6, 8, 6] # 把x扩展到长度5 f_x = interp1d(np.linspace(0, 1, len(x)), x, kind='linear') x_resampled = f_x(np.linspace(0, 1, len(y))) # 把y缩短到长度4 f_y = interp1d(np.linspace(0, 1, len(y)), y, kind='linear') y_resampled = f_y(np.linspace(0, 1, len(x))) print("扩展后的x:", x_resampled) print("缩短后的y:", y_resampled)
输出和NumPy方法一致。
核心逻辑说明
不管用哪种方法,本质都是:
- 把原始数组的索引映射到一个连续区间(比如0到1,或者0到原始长度-1)
- 在目标长度对应的新索引位置上,用线性插值计算对应值——扩展时补中间插值,缩短时合并相邻点的线性均值。
内容的提问来源于stack exchange,提问作者user22379888
相关产品推荐
相关产品推荐

