Python3 - 矩阵和数组之间的计算有效的相关性

时间:2017-03-08 17:14:34

标签: python performance python-3.x numpy correlation

我想将mxn矩阵的列与1xm数组相关联。这应该给我一个1xn阵列。目前我这样做有点笨拙:

c = np.corrcoef(X, y)[:-1,-1]

我在最后一列中找到了我想要的相关性,并且最后一行/列对应于数组与其自身的相关性(所以r = 1.0)。

这很好,但是,我需要在相当大的矩阵上执行此操作,基本上当它变得太计算重而且我的计算机放弃时。

例如,我正在执行此操作的最大矩阵的大小为

48x290400(= X)和48x1(= y),我希望最终得到290400个r值

这在Matlab中工作正常,但在使用np.corrcoef的python中没有。有人为此得到了很好的解决方案吗?

干杯 丹尼尔

1 个答案:

答案 0 :(得分:2)

我们可以在转置输入数组后使用this post中的corr2_coeff -

corr2_coeff(a.T,b.T).ravel()

示例运行 -

In [160]: a = np.random.rand(3, 5)

In [161]: b = np.random.rand(3, 1)

# Proposed in the question
In [162]: np.corrcoef(a.T, b.T)[:-1,-1]
Out[162]: array([-0.0716,  0.1905,  0.9699,  0.7482, -0.1511])

# Proposed in this post
In [163]: corr2_coeff(a.T,b.T).ravel()
Out[163]: array([-0.0716,  0.1905,  0.9699,  0.7482, -0.1511])

运行时测试 -

In [171]: a = np.random.rand(48, 10000)

In [172]: b = np.random.rand(48, 1)

In [173]: %timeit np.corrcoef(a.T, b.T)[:-1,-1]
1 loops, best of 3: 619 ms per loop

In [174]: %timeit corr2_coeff(a.T,b.T).ravel()
1000 loops, best of 3: 1.72 ms per loop

In [176]: 619.0/1.72
Out[176]: 359.8837209302326

那里有大量的 360x 加速!

进一步扩展 -

In [239]: a = np.random.rand(48, 29040)

In [240]: b = np.random.rand(48, 1)

In [241]: %timeit np.corrcoef(a.T, b.T)[:-1,-1]
1 loops, best of 3: 5.19 s per loop

In [242]: %timeit corr2_coeff(a.T,b.T).ravel()
100 loops, best of 3: 8.09 ms per loop

In [244]: 5190.0/8.09
Out[244]: 641.5327564894932

640x+ 加速这个更大的数据集,并且在我们实际数据集大小时应该更好地扩展!