Python-两个数组的交叉相关,其中包含nan项

时间:2018-10-10 12:28:20

标签: python numpy correlation

我获得了两个要互相关的数据数组,并获得了两个数组之间的延迟长度(如果有),然后将其标准化为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作为最大值?

1 个答案:

答案 0 :(得分:1)

首先,将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)

返回一个二维数组,解释两个(或多个)数组之间的对应关系。