如何计算二维NumPy数组中对应行的皮尔逊相关系数
计算NumPy数组对应行的皮尔逊相关系数
现有两个二维NumPy数组:
import numpy as np a = np.array([[1,2,4],[3,6,2],[3,4,7],[9,7,7],[6,3,1],[3,5,9]]) b = np.array([[4,5,2],[9,2,5],[1,5,6],[4,5,6],[1,2,6],[6,4,3]])
数组展开后为:
a = array([[1, 2, 4], [3, 6, 2], [3, 4, 7], [9, 7, 7], [6, 3, 1], [3, 5, 9]]) b = array([[4, 5, 2], [9, 2, 5], [1, 5, 6], [4, 5, 6], [1, 2, 6], [6, 4, 3]])
需求:计算a的第1行与b的第1行、a的第2行与b的第2行……以此类推,每一组对应行的皮尔逊相关系数,期望得到一个一维数组:
array([__ , __ , __, __ , __ , __])
已掌握列方向的计算方法,代码如下:
corr = np.corrcoef(a.T, b.T).diagonal(a.shape[1])
输出结果:
array([-0.2324843 , -0.03631365, -0.18057878])
更新说明
已采纳下方答案,这里提供一种替代解决方案,同时能解决零除错误问题:
def corr2_coeff(A, B): # 对输入数组按行求均值,并从原数组中减去该行均值 A_mA = A - A.mean(1)[:, None] B_mB = B - B.mean(1)[:, None] # 按行计算平方和 ssA = (A_mA**2).sum(1) ssB = (B_mB**2).sum(1) # 计算分母,添加极小值避免零除错误 deno = np.sqrt(np.dot(ssA[:, None], ssB[None])) + 1e-14 # 最终计算相关系数 return np.dot(A_mA, B_mB.T) / deno
内容的提问来源于stack exchange,提问作者prem
相关产品推荐
相关产品推荐

