我有两个大小相同>>> 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 T
和A
)。我想计算A和B中的每对同一行 m对之间的跨T的Pearson相关系数(因此B
和A[i,:]
,然后是{{1 }}和B[i,:]
;但例如永远不会是A[j,:]
和B[j,:]
。
我希望我的输出是形状为A[i,:]
的一维数组或形状为B[j,:]
的二维数组。
数组很大(大约1-2百万行),因此我正在寻找一种向量化的解决方案,该解决方案可以避免for循环。抱歉,如果已经回答了这个问题,但似乎以前的答案中的许多代码段(例如this one)都旨在提供完整的(M,)
相关矩阵-即,所有之间的相关系数可能的成对的行,而不仅仅是索引匹配的行;我正在寻找的基本上只是这个矩阵的对角线,但是如果我只需要对角线,那么计算整个东西就很浪费-实际上,无论如何我都会这样做会引发内存错误....
实现此目的最快的方法是什么?非常感谢。
答案 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]
索引。
祝你好运!