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

tf7tbtn2  于 2023-04-06  发布在  其他
关注(0)|答案(1)|浏览(137)

我有一个beat detect函数。首先,我用find peaks检测ecg信号中的r峰,并将峰存储在一个数组中。然后,该函数找到在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检测到了峰值。所有峰值都被找到了。之后我交换了我的ecg信号文件,然后proband 7出现了错误,measurement 4.然后我再次更换了ecg信号文件,只有先证者17,measurement 1出现错误,但是再次更换文件并没有带来任何改善,所以不可能是峰值检测或者ecg信号数据的原因。可以吗?我怎样才能解决这个问题,有什么想法吗?
我会很高兴的建议或解决方案。

dojqjjoe

dojqjjoe1#

你指派的

... = 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=阈值。

相关问题