用于峰值检测的空 numpy 数组 -> 值错误:不允许负维度



我有一个函数节拍检测。首先,我用find peaks检测ecg信号中的r-peaks,并将其存储在一个数组中。然后,该函数找到在ecg峰值范围内的ppg信号的所有峰值,并将它们也存储在数组中。现在我有几个先证物的测量,我的峰值将被检测到。我的代码循环遍历所有度量,并为每个度量逐一执行代码。然后我的程序已经中断了测量3在证物2和以下错误信息出现。控制台的错误输出

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

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

如果您有什么建议或解决方案,我将非常高兴。

你分配了

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

这对输入.shape—it施加了约束必须有一个以上的峰值入口。

所以检查一下:

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

这将帮助你逆流而上在数据流中,识别处理阶段无法识别出足够多的心电图峰值。例如,您可能希望以图形方式绘制输入然后调整height=prominence=阈值。