假设我有一组向量(来自传感器1的读数,来自传感器2的读数,来自传感器3的读数 - 首先通过时间戳索引,然后通过传感器ID索引),我想将其与一组单独的相关联矢量(温度,湿度等 - 也都是首先按时间戳索引,其次是按类型索引)。
numpy中最干净的方法是什么?看起来它应该是一个相当简单的功能...
换句话说,我想看看:
> a.shape
(365,20)
> b.shape
(365, 5)
> correlations = magic_correlation_function(a,b)
> correlations.shape
(20, 5)
干杯, / YGA
P.S。我被要求添加一个例子。
以下是我想看到的内容:
$ In [27]: x
$ Out[27]:
array([[ 0, 0, 0],
[-1, 0, -1],
[-2, 0, -2],
[-3, 0, -3],
[-4, 0.1, -4]])
$ In [28]: y
$ Out[28]:
array([[0, 0],
[1, 0],
[2, 0],
[3, 0],
[4, 0.1]])
$ In [28]: magical_correlation_function(x, y)
$ Out[28]:
array([[-1. , 0.70710678, 1. ]
[-0.70710678, 1. , 0.70710678]])
Ps2:哎呀,错误地转录了我的榜样。对不起。现在修好了。
答案 0 :(得分:2)
我能找到的最简单的事情是使用scipy.stats包
In [8]: x
Out[8]:
array([[ 0. , 0. , 0. ],
[-1. , 0. , -1. ],
[-2. , 0. , -2. ],
[-3. , 0. , -3. ],
[-4. , 0.1, -4. ]])
In [9]: y
Out[9]:
array([[0. , 0. ],
[1. , 0. ],
[2. , 0. ],
[3. , 0. ],
[4. , 0.1]])
In [10]: import scipy.stats
In [27]: (scipy.stats.cov(y,x)
/(numpy.sqrt(scipy.stats.var(y,axis=0)[:,numpy.newaxis]))
/(numpy.sqrt(scipy.stats.var(x,axis=0))))
Out[27]:
array([[-1. , 0.70710678, -1. ],
[-0.70710678, 1. , -0.70710678]])
这些不是你得到的数字,但你已经混淆了你的行。 (元素[0,0]应为1。)
更复杂,但纯粹是numpy解决方案
In [40]: numpy.corrcoef(x.T,y.T)[numpy.arange(x.shape[1])[numpy.newaxis,:]
,numpy.arange(y.shape[1])[:,numpy.newaxis]]
Out[40]:
array([[-1. , 0.70710678, -1. ],
[-0.70710678, 1. , -0.70710678]])
这会慢一些,因为它会计算x中每个元素与x中的其他元素的相关性,这是您不想要的。此外,用于获取所需阵列子集的高级索引技术可能会让您头疼。
如果您要强烈使用numpy,请熟悉broadcasting和indexing上的规则。它们将帮助您尽可能地降低到C级别。
答案 1 :(得分:1)
这会做你想做的吗?
correlations = dot(transpose(a), b)
注意:如果您这样做,您可能希望首先标准化或美白a
和b
,例如等同于此的东西:
a = sqrt((a - mean(a))/(var(a)))
b = sqrt((b - mean(b))/(var(b)))
答案 2 :(得分:-1)
正如大卫所说,你应该定义你正在使用的相关性。我不知道在关联空信号和非空信号时给出合理数字的任何相关定义。