2D和3D数组之间的相关系数 - NumPy / Python

时间:2017-03-07 18:31:06

标签: python numpy multidimensional-array vectorization

import numpy as np
A = np.ones([n,m])
B = np.ones([o,n,m])

有没有办法计算相关系数而无需循环

C = corr(A,B) = array([1,o])

mno用于表达维度。

Loopy示例:

from scipy.stats.stats import pearsonr

A = np.random.random([5,5])
B = np.random.random([3,5,5])
C = []
for i in B:
    C.append(pearsonr(A.flatten(), i.flatten())[0])

C = np.array(C)

1 个答案:

答案 0 :(得分:1)

我们可以在将输入重新整形为corr2_coeff版本后使用this post中的2D,这样第一个输入就会被重新整形为一列数组而第二个输入将具有列与其最后两个轴的组合长度相同,如此 -

corr2_coeff(A.reshape(1,-1),B.reshape(B.shape[0],-1)).ravel()

示例运行 -

In [143]: from scipy.stats.stats import pearsonr
     ...: 
     ...: A = np.random.random([5,5])
     ...: B = np.random.random([3,5,5])
     ...: C = []
     ...: for i in B:
     ...:     C.append(pearsonr(A.flatten(), i.flatten())[0])
     ...: 
     ...: C = np.array(C)
     ...: 

In [144]: C
Out[144]: array([ 0.05637413, -0.26749579, -0.08957621])

In [145]: corr2_coeff(A.reshape(1,-1),B.reshape(B.shape[0],-1)).ravel()
Out[145]: array([ 0.05637413, -0.26749579, -0.08957621])

对于非常庞大的数组,我们可能需要采用单循环,如此 -

[corr2_coeff(A.reshape(1,-1), i.reshape(1,-1)) for i in B]