You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何针对二维数组的每列迭代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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 06:42:53