使用numpy按固定delta对非规则数字列表采样的更简便方法
Numpy 实现方案
直接上可运行代码:
import numpy as np X = np.array([1, 4, 5, 6, 11, 13, 15, 20, 21, 22, 25, 30]) delta = 5 # 定义采样规则函数 def sample_rule(current_val, last_selected): return current_val if current_val - last_selected >= delta else last_selected # 转为numpy通用函数并做累积计算 ufunc = np.frompyfunc(sample_rule, 2, 1) calc_result = ufunc.accumulate(X, dtype=np.object_).astype(X.dtype) # 提取采样点(结果跳变的位置就是符合规则的采样点) samples = X[np.diff(calc_result, prepend=calc_result[0]-1) != 0] # 如果需要输出Python原生列表,加一行即可: # samples = samples.tolist()
运行后得到的samples和你给出的原生Python实现结果完全一致:[1, 6, 11, 20, 25, 30]。
逻辑说明
- 首先自定义符合「相邻差值≥delta」规则的判断函数,将其转为numpy支持累积操作的通用函数
- 用
accumulate方法对整个X序列做逐元素累积判断,得到每一步应该保留的采样值 - 结果序列中值发生跳变的位置,就是符合规则的采样点位置,直接提取对应X的元素即可
优势
这套实现是numpy向量化运算逻辑,当X的长度达到万级以上时,运行效率比原生Python循环有明显的数量级提升。
内容的提问来源于stack exchange,提问作者rindis
相关产品推荐
相关产品推荐

