我有两个形状为 N X T
和 M X T
的数组 . 我想在每个可能的行对 n
和 m
(分别来自 N
和 M
)之间计算 T
之间的相关系数 .
什么是最快,最pythonic的方式来做到这一点? (循环 N
和 M
在我看来既不快也不是pythonic . )我期待答案涉及 numpy
和/或 scipy
. 现在我的数组是 numpy
array
s,但我愿意将它们转换为另一种类型 .
我期待我的输出是一个形状为 N X M
的数组 .
注:当我说"correlation coefficient,"时,我的意思是Pearson product-moment correlation coefficient .
以下是一些需要注意的事项:
-
numpy
函数correlate
要求输入数组为一维 . -
numpy
函数corrcoef
接受二维数组,但它们必须具有相同的形状 . -
scipy.stats
函数pearsonr
要求输入数组为一维 .
2 回答
Correlation (default 'valid' case) between two 2D arrays:
您可以像这样使用矩阵乘法np.dot -
与两个输入数组的每个成对行组合(row1,row2)之间的默认
"valid"
情况的相关性将对应于每个(row1,row2)位置处的乘法结果 .Row-wise Correlation Coefficient calculation for two 2D arrays:
这是基于这个解决方案How to apply corr2 functions in Multidimentional arrays in MATLAB
Benchmarking
本节将运行时性能与other answer.中列出的
generate_correlation_map
&loopypearsonr
方法的建议方法进行比较(取自函数test_generate_correlation_map()
,其末尾没有值正确性验证码) . 请注意,建议方法的时间还包括在开始时检查两个输入数组中是否有相同数量的列,这也是在另一个答案中完成的 . 下面列出了运行时 .情况1:
案例#2:
案例#3:
另一个循环
pearsonr based
方法似乎太慢,但这里是一个小数据的运行时 -@Divakar为计算未缩放的相关性提供了一个很好的选择,这是我最初要求的 .
为了计算相关系数,需要更多:
这是对此函数的测试,该函数通过: