首页 > 解决方案 > 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 值,有没有更好的方法来交叉关联两个数组?我已经测试过运行interp1dfill_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 作为最大值?

标签: pythonnumpycorrelation

解决方案


首先,用其余元素的平均值或众数替换 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)

它返回一个二维数组,解释两个(或更多)数组之间的关联。


推荐阅读