用Python计算两个2d数组之间的逐行相关系数

时间:2018-12-03 21:46:58

标签: python arrays numpy correlation

我有两个大小相同>>> selectAmtColsExpr = [col(y).cast("int") for y in colWithAmt] >>> selectPctColsExpr = [(col(z)/100).cast("decimal(3,2)").alias(z) for z in colWithPct] >>> selectRemainingColsExpr = colWithRemainings col_unfmt.select(selectRemainingColsExpr+selectPctColsExpr+selectAmtColsExpr).show(20,False) +-------------+--------+--------+-------+-------+-------+-------+-------+-------+-------+ |year_mnth_nbr|partn_id|emp_name|fst_pct|snd_pct|trd_pct|fst_amt|snd_amt|trd_amt|fth_amt| +-------------+--------+--------+-------+-------+-------+-------+-------+-------+-------+ |201812 |1 |Kou |0.13 |0.14 |0.16 |11 |12 |15 |17 | |201812 |1 |Cha |0.23 |0.24 |0.26 |21 |22 |25 |27 | |201812 |1 |Cha |0.23 |0.24 |1.00 |21 |22 |25 |27 | +-------------+--------+--------+-------+-------+-------+-------+-------+-------+-------+ 的numpy数组(我们叫它们M X TA)。我想计算A和B中的每对同一行 m对之间的跨T的Pearson相关系数(因此BA[i,:],然后是{{1 }}和B[i,:];但例如永远不会是A[j,:]B[j,:]

我希望我的输出是形状为A[i,:]的一维数组或形状为B[j,:]的二维数组。

数组很大(大约1-2百万行),因此我正在寻找一种向量化的解决方案,该解决方案可以避免for循环。抱歉,如果已经回答了这个问题,但似乎以前的答案中的许多代码段(例如this one)都旨在提供完整的(M,)相关矩阵-即,所有之间的相关系数可能的成对的行,而不仅仅是索引匹配的行;我正在寻找的基本上只是这个矩阵的对角线,但是如果我只需要对角线,那么计算整个东西就很浪费-实际上,无论如何我都会这样做会引发内存错误....

实现此目的最快的方法是什么?非常感谢。

1 个答案:

答案 0 :(得分:0)

我想我只会使用列表理解和一个​​用于计算系数的模块:

from scipy.stats.stats import pearsonr
import numpy as np

M = 10
T = 4
A = np.random.rand(M*T).reshape((M, T))
B = np.random.rand(M*T).reshape((M, T))
diag_pear_coef = [pearsonr(A[i, :], B[i, :])[0] for i in range(M)]

这对您有用吗?请注意,pearsonr不仅返回相关系数,还返回[0]索引。
祝你好运!