用于峰值检测的空 numpy 数组 -> ValueError:不允许负尺寸

问题描述 投票:0回答:1

我有节拍检测功能。首先,我使用 find peaks 检测 ecg 信号中的 r-peaks,并将这些峰值存储在一个数组中。然后该函数找到 ecg 峰值范围内的 ppg 信号的所有峰值,并将它们也存储在一个数组中。 现在我对几个先证者进行了多次测量,其中我的峰值将被检测到。我的代码遍历所有测量并为每个测量一个一个地执行代码。然后我的程序在先证者 2 处中断了测量 3,并出现以下错误消息。Output of the error in the console

ValueError: negative dimensions are not allowed

def beat_detect (ECG, PPG_red_interp, PPG_ir_interp, PPG_red2_interp, PPG_ir2_interp):
  ecg_peaks = signal.find_peaks(ECG, height=np.mean(ECG)+2*np.std(ECG), prominence=np.mean(ECG)+np.std(ECG))
  ecg_beats = np.zeros((len(ecg_peaks[0]) - 2, 110))
  ppg_red_beats = np.zeros((len(ecg_peaks[0]) - 2, 110))
  ppg_ir_beats = np.zeros((len(ecg_peaks[0]) - 2, 110))
  ppg_red2_beats = np.zeros((len(ecg_peaks[0]) - 2, 110))
  ppg_ir2_beats = np.zeros((len(ecg_peaks[0]) - 2, 110))
    
  for i in range(1, len(ecg_peaks[0])-1):
      ecg_beats[i-1] = ECG[ecg_peaks[0][i]-55:ecg_peaks[0][i]+55]
      ppg_red_beats[i-1] = PPG_red_interp[ecg_peaks[0][i]-55:ecg_peaks[0][i]+55]
      ppg_ir_beats[i-1] = PPG_ir_interp[ecg_peaks[0][i]-55:ecg_peaks[0][i]+55]
      ppg_red2_beats[i-1] = PPG_red2_interp[ecg_peaks[0][i]-55:ecg_peaks[0][i]+55]
      ppg_ir2_beats[i-1] = PPG_ir2_interp[ecg_peaks[0][i]-55:ecg_peaks[0][i]+55]
        
  return ecg_peaks, ecg_beats, ppg_red_beats, ppg_ir_beats, ppg_red2_beats,  ppg_ir2_beats

我认为这是因为我的 find peaks 函数没有在 ecg 信号中找到任何峰值,所以我在数组 ecg_peaks 中没有值。因此,对于发生错误的 ecg 信号,我用 find peaks 检测到了峰值。找到所有峰。之后我交换了我的心电信号文件,然后错误发生在先证者 7,测量 4。然后我再次交换心电图信号文件,错误只发生在先证者 17,测量 1。但是,再次更换文件没有带来任何改进。 所以这不可能是由于峰值检测或 ecg 信号数据,对吗?我该如何解决这个问题,有什么想法吗?

我会很高兴提出建议或解决方案。

numpy scipy signal-processing numpy-ndarray beat-detection
1个回答
0
投票

你分配了

    ... = np.zeros((len(ecg_peaks[0]) - 2, 110))

这对输入施加了约束

.shape
——它 必须有一个以上的峰值条目。

所以检查它:

    assert len(ecg_peaks[0]) >= 2, ecg_peaks[0]
    ... = np.zeros((len(ecg_peaks[0]) - 2, 110))

这将帮助您向上游追查问题 在数据流中,识别处理阶段 无法识别足够的 ECG 峰值。 例如,您可能希望以图形方式绘制输入 然后调整您的

height=
prominence=
阈值。

© www.soinside.com 2019 - 2024. All rights reserved.