Есть ли способ векторизовать вычисление коэффициентов корреляции из этого массива Numpy?

#python #numpy #vectorization

#python #numpy #векторизация

Вопрос:

Этот код вычисляет коэффициент корреляции Пирсона для всех возможных пар векторов элементов L = 45, взятых из стека M = 102272. Результатом является симметричная матрица MxM, занимающая около 40 ГБ памяти. Потребность в памяти не является проблемой для моего компьютера, но я оцениваю из тестовых запусков, что для завершения ~ 5 миллиардов проходов через внутренний цикл потребуется 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
    
 

Ответ №1:

Для вычисления корреляционной матрицы уже существует встроенная функция 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.        ]])
 

Ссылка на документацию

Комментарии:

1. Мне нужно использовать параметр dtype= ‘float32’ в Numpy>= 1.20, чтобы результаты поместились в память, но это закончилось всего за несколько минут! Спасибо.