我想将mxn矩阵的列与1xm数组相关联。这应该给我一个1xn阵列。目前我这样做有点笨拙:
c = np.corrcoef(X, y)[:-1,-1]
我在最后一列中找到了我想要的相关性,并且最后一行/列对应于数组与其自身的相关性(所以r = 1.0)。
这很好,但是,我需要在相当大的矩阵上执行此操作,基本上当它变得太计算重而且我的计算机放弃时。
例如,我正在执行此操作的最大矩阵的大小为:
48x290400(= X)和48x1(= y),我希望最终得到290400个r值
这在Matlab中工作正常,但在使用np.corrcoef的python中没有。有人为此得到了很好的解决方案吗?
干杯 丹尼尔
答案 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+
加速这个更大的数据集,并且在我们实际数据集大小时应该更好地扩展!