有没有办法从这个 Numpy 数组中矢量化相关系数的计算?
Is there a way to vectorize the calculation of correlation coefficients from this Numpy array?
此代码计算从 M=102272 的堆栈中提取的所有可能的 L=45 元素向量对的皮尔逊相关系数。结果是一个对称的 MxM 矩阵占用大约 40 GB 的内存。内存要求对我的计算机来说不是问题,但我从测试运行中估计,大约 50 亿次通过内部循环将需要 2-3 天才能完成。我的问题:是否有直接的方法来矢量化内部循环以显着加快速度?
# L = 45
# M = 102272
# data[M,L] (type 'float32')
cmat = np.zeros((M,M))
for i in range(M):
v1 = data[i,:]
z1 = (v1-np.average(v1))/np.std(v1)
for j in range(i+1):
v2 = data[j,:]
z2 = (v2-np.average(v2))/np.std(v2)
cmmat[i,j] = cmmat[j,i] = z1.dot(z2)/L
已经存在一个内置的 numpy 函数来计算相关矩阵。随便用!
>>> import numpy as np
>>> rng = np.random.default_rng(seed=42)
>>> xarr = rng.random((3, 3))
>>> xarr
array([[0.77395605, 0.43887844, 0.85859792],
[0.69736803, 0.09417735, 0.97562235],
[0.7611397 , 0.78606431, 0.12811363]])
>>> R1 = np.corrcoef(xarr)
>>> R1
array([[ 1. , 0.99256089, -0.68080986],
[ 0.99256089, 1. , -0.76492172],
[-0.68080986, -0.76492172, 1. ]])
此代码计算从 M=102272 的堆栈中提取的所有可能的 L=45 元素向量对的皮尔逊相关系数。结果是一个对称的 MxM 矩阵占用大约 40 GB 的内存。内存要求对我的计算机来说不是问题,但我从测试运行中估计,大约 50 亿次通过内部循环将需要 2-3 天才能完成。我的问题:是否有直接的方法来矢量化内部循环以显着加快速度?
# L = 45
# M = 102272
# data[M,L] (type 'float32')
cmat = np.zeros((M,M))
for i in range(M):
v1 = data[i,:]
z1 = (v1-np.average(v1))/np.std(v1)
for j in range(i+1):
v2 = data[j,:]
z2 = (v2-np.average(v2))/np.std(v2)
cmmat[i,j] = cmmat[j,i] = z1.dot(z2)/L
已经存在一个内置的 numpy 函数来计算相关矩阵。随便用!
>>> import numpy as np
>>> rng = np.random.default_rng(seed=42)
>>> xarr = rng.random((3, 3))
>>> xarr
array([[0.77395605, 0.43887844, 0.85859792],
[0.69736803, 0.09417735, 0.97562235],
[0.7611397 , 0.78606431, 0.12811363]])
>>> R1 = np.corrcoef(xarr)
>>> R1
array([[ 1. , 0.99256089, -0.68080986],
[ 0.99256089, 1. , -0.76492172],
[-0.68080986, -0.76492172, 1. ]])