Python-内部具有NaN的两个信号的互相关

时间:2018-10-14 11:35:49

标签: python numpy math scipy

我得到了两个信号S1和S2(两个值的数组),我想知道S1是否与S2是相同的信号但发生了移位(S1和S2的图形表示相同,但​​是S1将移至左右)

问题是:我的算法包含插值scipy.interpolate.interp1d,并且此函数在数组中输入NaN值。

当我尝试将S1和S2与内部的NaN相关时,相关数组始终为[NaN, NaN, NaN, ... , NaN, NaN, NaN]

我的目的是: 1)检测S1和S2是否是同一信号(如果相关性高于某个阈值,我将认为它们是同一信号) 2)如果有,请检测它们之间的偏移,以便将其删除

为了说明我的算法,我创建了一个简单的代码

import numpy as np
from scipy.signal import correlate

norm = np.linalg.norm

x = np.array([np.nan,1,2,3,0,0,np.nan])
y = np.array([1,2,3,0,0,np.nan,np.nan,np.nan])

corr = correlate(x, y)

print(corr/(norm(x)*norm(y)))

此处的相关函数为scipy.signal.correlate,但我也尝试使用np.correlate,结果也相同

从stackoverflow帖子中,我尝试过这种方式:

x = np.array([np.nan,1,2,3,0,0,np.nan])
y = np.array([1,2,3,0,0,np.nan,np.nan,np.nan])

normx = norm(x[~np.isnan(x)])
normy = norm(y[~np.isnan(y)])

maskx = np.ma.array(x, mask=np.isnan(x))
masky = np.ma.array(y, mask=np.isnan(y))

corr = correlate(maskx, masky)

但是我仍然只有NaN值。

我做错了什么吗?

1 个答案:

答案 0 :(得分:1)

如果任何信号包含NaN,则复数将全部为NaN。


使用此方法首先删除nan,然后使用相关函数:

x = np.array([np.nan,1,2,3,0,0,np.nan])
y = np.array([1,2,3,0,0,np.nan,np.nan,np.nan])

x = x[~np.isnan(x)]
y = y[~np.isnan(y)]

corr = np.corrcoef(x, y)

#corrcoef returns the normalised covariance matrix so you want the [1,0] or [0,1] element of this matrix
print(corr[1,0])
#1.0