我获得了两个要互相关的数据数组,并获得了两个数组之间的延迟长度(如果有),然后将其标准化为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作为最大值?
答案 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)
返回一个二维数组,解释两个(或多个)数组之间的对应关系。