You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

如何利用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

火山引擎 最新活动