基于局部峰值分割numpy数组y为子数组的技术求助
按峰值位置分割numpy数组为子数组
现有代码与数据
已处理得到numpy数组y,相关处理代码如下:
import pandas as pd import numpy as np from scipy.signal import butter_lowpass_filter, find_peaks data=pd.read_csv('samplesdata.csv',sep=";", decimal=",",encoding='latin-1') sensor_data=data[['Euklidische Norm']] sensor_data = np.array(sensor_data).ravel() sensor_data = sensor_data - np.average(sensor_data) # Filter requirements. order = 2 fs = 100 # sample rate, Hz cutoff = 1 y = butter_lowpass_filter(sensor_data, cutoff, fs, order) peaks = find_peaks(y*-1, height = 0.00, threshold = None, distance=170) height = peaks[1]['peak_heights'] # 峰值高度列表 peak_pos = peaks[0] # 峰值对应的数组索引位置
峰值高度数组height数据:
[0.06110087, 0.10401105, 0.07522478, 0.09554681, 0.08982648, 0.09118464, 0.09309628, 0.10440643, 0.08335122, 0.14826715, 0.09760258, 0.13332452, 0.11009777, 0.1806636 ]
需求
将数组y分割为多个子数组,以peak_pos中的峰值索引为边界,每个子数组包含相邻两个峰值及二者之间的所有元素:
- 第一个子数组:从第一个峰值到第二个峰值的所有值(包含两个峰值)
- 第二个子数组:从第二个峰值到第三个峰值的所有值(包含两个峰值)
- 以此类推
解决方案
利用numpy的左闭右开切片特性,遍历峰值索引数组,依次截取相邻峰值间的片段即可(结束索引需+1以包含右侧峰值元素):
# 初始化存储子数组的列表 sub_arrays = [] # 遍历相邻峰值对 for i in range(len(peak_pos) - 1): start_idx = peak_pos[i] # 结束索引+1,确保包含第二个峰值 end_idx = peak_pos[i + 1] + 1 # 截取子数组 sub_array = y[start_idx:end_idx] sub_arrays.append(sub_array)
执行后,sub_arrays列表中存储了所有符合要求的子数组,可通过sub_arrays[0]、sub_arrays[1]等访问对应片段。
内容的提问来源于stack exchange,提问作者Papadopolous
相关产品推荐
相关产品推荐

