Python-内部有 nan 条目的两个数组的互相关

标签 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 值,是否有更好的方法来交叉关联两个数组? 我已经测试过使用 fill_value='extrapolate' 运行 interp1d,但它会导致相关计算出现问题。是否有另一个值可以传递给 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 的关联不是您正在寻找的。

来自文档:

Cross-correlation of two 1-dimensional sequences.

This function computes the correlation as generally defined in signal processing texts:

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)

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

关于Python-内部有 nan 条目的两个数组的互相关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52740300/

相关文章:

python - 提取 Nx3 数组的特定行,每列都满足条件

r - 使用 R 查找相关对

python - numpy 识别的特殊方法的文档位置

python - 使用 ReGex 、Python 匹配表达式

python - 将大图像保存在另一个线程中

pandas - 矢量化 pandas 申请 pd.date_range

python - 从 Pylons 返回动态 png

python - 使用 numpy.where 构建数组时,为什么我的数组长度为 1?

r - 使用 R 的非零零假设的相关显着性

python - 将相关矩阵转换为 pandas 中的 3 列数据框?