如何用更简洁的Python方法计算numpy数组间的平均成对皮尔逊相关系数
你可以直接用numpy内置的向量化操作实现,完全不需要写双层循环,代码更简洁的同时运行效率也会高很多。
首先np.corrcoef方法直接传入shape为(n, m)的二维数组时,默认将每一行作为一个变量、每一列作为观测值,返回的就是形状为(n, n)的成对相关系数矩阵,矩阵中第i行第j列的元素就是第i个数组和第j个数组的皮尔逊相关系数。
你需要的所有i<j的成对结果,正好对应这个矩阵上三角不包含对角线的部分,直接提取这部分求平均值即可,实现代码如下:
# 计算全量成对相关系数矩阵 corr_matrix = np.corrcoef(stc_data_roi) # 提取上三角(不含对角线)的所有元素,对应i<j的成对结果 upper_tri_corr = corr_matrix[np.triu_indices_from(corr_matrix, k=1)] # 计算平均值 avg_corr = upper_tri_corr.mean()
另外提个小问题:你原来的代码存在计算错误,np.corrcoef传入两个一维数组时返回的是2×2的相关系数矩阵,你直接把整个矩阵加到sum_dd里,实际会把矩阵里四个元素都算入总和,你需要的交叉相关系数实际只对应返回矩阵的[0,1]位置的元素,用上面的向量化写法可以规避这个问题。
内容的提问来源于stack exchange,提问作者Kadaj13
相关产品推荐
相关产品推荐

