如何利用scipy.argrelextrema输出的行列索引创建Numpy布尔数组
解决用argrelextrema结果创建峰值布尔数组的问题
嘿,这问题其实很容易搞定,而且完全可以用向量化操作实现,不用绕弯子用np.where。咱们一步步来拆解:
核心思路
argrelextrema返回的两个索引数组(对应行和列)就是直接的“坐标”,你只需要初始化一个和原始数据形状一致的全False布尔数组,然后直接用这组坐标给峰值位置赋值为True就行——这就是最直接高效的向量化方案,完全不需要循环。
完整代码示例
先导入需要的库:
import numpy as np import pandas as pd from scipy.signal import argrelextrema
模拟你的DataFrame数据:
# 生成10行5列的随机数据作为示例,替换成你自己的真实数据即可 df = pd.DataFrame(np.random.rand(10, 5))
调用argrelextrema获取峰值的行列索引:
# 按行方向(axis=0)找局部最大值,order=1表示比较相邻1个元素 row_indices, col_indices = argrelextrema(df.values, np.greater, axis=0, order=1)
创建布尔数组并标记峰值:
# 初始化和原始数据同形状的全False布尔数组 peak_bool_array = np.zeros(df.shape, dtype=bool) # 直接用索引赋值,纯向量化操作,没有冗余计算 peak_bool_array[row_indices, col_indices] = True
现在peak_bool_array里的峰值位置就都是True,其余位置保持False,完全符合你的需求。
为什么不用np.where?
np.where更适合从条件表达式中提取索引,而咱们这里已经通过argrelextrema拿到了明确的峰值坐标,直接用索引赋值比再套np.where更简洁高效,完美契合向量化的要求。
额外补充:一维数据的情况
如果你的数据是一维的,处理逻辑几乎一样:
data = np.random.rand(20) # argrelextrema返回的是元组,里面是一个索引数组 peak_indices = argrelextrema(data, np.greater, order=1)[0] peak_bool = np.zeros(len(data), dtype=bool) peak_bool[peak_indices] = True
内容的提问来源于stack exchange,提问作者Stefan




