如何针对二维数组的每列迭代SciPy峰值检测算法?
问题描述
- 正在对来自图像堆栈的信号进行峰值计数,该堆栈包含180张图像(成像频率1Hz)
- 已从堆栈中分割出20-100个细胞目标,构建为二维NumPy数组,形状示例为「细胞数量×180秒」,每一列对应一个细胞的180秒信号轨迹(delta F/F)
- 希望使用SciPy的
find_peaks峰值计数算法在信号轨迹上标记峰值,但该函数仅支持一维数组输入 - 曾尝试将二维数组展平为一维数组计数,但切换不同细胞时会产生虚假峰值
- 询问是否可以通过for循环迭代二维数组的每一列,让
find_peaks将每一列视为一维数组处理,无需重塑数组 - 尝试的代码如下:
from scipy.signal import find_peaks peaks = np.zeros_like(smooth_signal) for i in range(smooth_signal): peaks[:, i], _ = find_peaks(smooth_signal[:, i], height=1.2) np.savetxt("peaks.csv", peaks, delimiter=',')
解决方案
你的思路完全可行,仅需修正代码中的一处错误:
range(smooth_signal)是无效写法,range()需要传入整数参数,你需要迭代数组的列数,即使用range(smooth_signal.shape[1])(shape[1]表示数组的列维度长度)
修正后的完整代码:
import numpy as np from scipy.signal import find_peaks # smooth_signal 为形状15×180的二维数组,每一列对应单个细胞的180秒信号轨迹 peaks = np.zeros_like(smooth_signal) # 迭代每一列(每个细胞的信号) for col_idx in range(smooth_signal.shape[1]): # 提取当前列的一维信号轨迹 cell_signal = smooth_signal[:, col_idx] # 调用find_peaks获取峰值位置 peak_indices, _ = find_peaks(cell_signal, height=1.2) # 在peaks数组的对应位置标记峰值(用1表示) peaks[peak_indices, col_idx] = 1 # 将标记好峰值的数组保存为CSV np.savetxt("peaks.csv", peaks, delimiter=',')
代码说明:
- 循环遍历数组的每一列,将每一列单独作为一维数组传入
find_peaks,避免了展平数组导致的虚假峰值 - 用
peaks数组(与原信号同形状)记录峰值位置,峰值处标记为1,其余位置为0,方便后续分析或可视化
内容的提问来源于stack exchange,提问作者Ross O' Carroll
相关产品推荐
相关产品推荐

