2009-04-27 52 views
3

比方说,我有一组向量(来自传感器1的读数,从传感器2的读数,从传感器3的读数 - 首先通过时间戳索引,然后通过传感器ID),我想关联到一个单独的组向量(温度,湿度等 - 也都是先按时间戳索引,其次按类型索引)。将一组向量与numpy中的另一个关联?

什么是numpy的最干净的方式做到这一点?现在看来似乎应该是一个相当简单的功能...

换句话说,我希望看到:

> a.shape 
(365,20) 

> b.shape 
(365, 5) 

> correlations = magic_correlation_function(a,b) 

> correlations.shape 
(20, 5) 

干杯, /YGA

附:我被要求添加一个例子。

这是我想看到的内容:

$ 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

这不是明显对我你想做什么,你能也许张贴例如输入和输出(对于一些较小的尺寸数据)? – 2009-04-27 23:10:37

+2

你用什么公式来达到这些数字?我似乎无法用任何正常的相关/协方程公式来重现它们(但我不是统计专家)。 – 2009-04-28 00:00:51

回答

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

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

0

这是否会做你想要什么?

correlations = dot(transpose(a), b) 
相关问题