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

4 投票
3 回答
1720 浏览
提问于 2025-04-15 11:17

假设我有一组向量(来自传感器1的读数、来自传感器2的读数、来自传感器3的读数——这些数据首先按时间戳排序,然后按传感器ID排序),我想把它们和另一组向量(温度、湿度等——这些数据同样也是先按时间戳排序,然后按类型排序)进行关联。

在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]])

补充说明:哎呀,我把我的例子写错了。抱歉大家。现在已经修正了。

3 个回答

-1

正如大卫所说,你需要明确你所使用的相关性定义。我不知道有什么相关性的定义可以在比较空信号和非空信号时给出合理的数字。

1

这样做能达到你想要的效果吗?

correlations = dot(transpose(a), b)

注意:如果你这样做的话,可能需要先对 ab 进行标准化或者白化处理,比如说做一些类似于下面的操作:

a = sqrt((a - mean(a))/(var(a)))
b = sqrt((b - mean(b))/(var(b)))
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中每个元素和其他每个元素的相关性,这样做其实没必要。而且,获取你想要的数组子集时使用的高级索引技巧可能会让你感到困惑。

如果你打算深入使用numpy,建议你熟悉一下广播索引的规则。这些知识能帮助你尽量把计算推到C语言层面,提高效率。

撰写回答