在numpy中将一组向量与另一组向量相关联?

时间:2009-04-27 22:43:38

标签: python numpy

假设我有一组向量(来自传感器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:哎呀,错误地转录了我的榜样。对不起。现在修好了。

3 个答案:

答案 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,请熟悉broadcastingindexing上的规则。它们将帮助您尽可能地降低到C级别。

答案 1 :(得分:1)

这会做你想做的吗?

correlations = dot(transpose(a), b)

注意:如果您这样做,您可能希望首先标准化或美白ab,例如等同于此的东西:

a = sqrt((a - mean(a))/(var(a)))
b = sqrt((b - mean(b))/(var(b)))

答案 2 :(得分:-1)

正如大卫所说,你应该定义你正在使用的相关性。我不知道在关联空信号和非空信号时给出合理数字的任何相关定义。