python - Python - 内部包含 nan 条目的两个数组的互相关
问题描述
我得到了两个要互相关的数据数组,并得到两个数组之间的延迟长度(如果有),然后在 0 和 1 之间对其进行归一化。例如:
import numpy as np
x = [0,1,1,1,2,0,0]
y = [0,0,0,1,1,1,2]
corr = np.correlate(a,b, 'full')
norm = np.linalg.norm
normalized = corr/(norm(a)*norm(b))
返回:
[0.0, 0.0, 0.29, 0.43, 0.57, 1.0, 0.57, 0.43, 0.29, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]
问题是:我需要关联两个图形,并且 X 数组不规则(两个数组也不一样,只是一些 y 值链接到一些 x 值),所以我在关联之前对数据进行插值scipy.interpolate.interp1d
它会在我的数组中产生 NaN 条目。此时相关函数只返回 NaN
例如:
import numpy as np
x = [0,1,1,1,2,0,np.nan]
y = [np.nan,0,0,1,1,1,2]
corr = np.correlate(a,b, 'full')
norm = np.linalg.norm
normalized = corr/(norm(a)*norm(b))
返回:
[nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan]
我终于明白我得到这个是因为 norm(a) 结果为 NaN,我的问题是:我怎么能忽略那些 NaN 值,有没有更好的方法来交叉关联两个数组?我已经测试过运行interp1d
,fill_value='extrapolate'
但它会导致相关计算出现问题。是否有另一个值可以传递给 fill_value 来“忽略”数据中的缺失值?
此外,np.correlate(x,y)
返回NaN
但如果我们看np.correlate(x,y,'full')
它实际上返回[ 0. 0. 2. 3. 4. 7. 4. nan nan nan nan nan nan nan nan]
,为什么 numpy 将 NaN 作为最大值?
解决方案
首先,用其余元素的平均值或众数替换 NAN 值。这是最幼稚的技术。如何使用 NAN 可能是一个完全不同的问题。您可以np.nanmean()
用于此目的。
Numpy 的相关性不是您要寻找的。
从文档:
两个一维序列的互相关。
此函数计算信号处理文本中通常定义的相关性:
c_{av}[k] = sum_n a[n+k] * conj(v[n])
您应该看一下 Pearson 相关系数,它是两个变量 X 和 Y 之间线性相关性的度量。
from scipy.stats.stats import pearsonr
x = [0,1,1,1,2,0,np.nan]
y = [np.nan,0,0,1,1,1,2]
corr = pearsonr(x,y, 'full')
或者你也可以使用
numpy.corrcoef(x,y)
它返回一个二维数组,解释两个(或更多)数组之间的关联。