簡體   English   中英

如何計算一維 numpy 數組與二維 numpy 數組的每一列之間的相關性

[英]How to calculate correlation between 1D numpy array and every column of a 2D numpy array

我有一個 1D numpy 數組(y)和 2D numpy 數組(x),我計算 y 和 x 中每一列之間的相關性,如下所示:

import numpy as np
from scipy.stats import pearsonr

rng = np.random.default_rng(seed=42)

x = rng.random((3, 3))
y = rng.random(3)

for i in range(x.shape[1]):
    print( pearsonr(x[:, i], y)[0]  )

我想知道如何在沒有For循環的情況下獲得相關值。 有什么辦法嗎?

是的,很可能只需要一行 np.corrcoef 返回 pearson 相關值。 您可以在鏈接中找到更多信息

https://numpy.org/doc/stable/reference/generated/numpy.corrcoef.html

np.corrcoef(x, y)

或者

np.corrcoef(x, y False)
# equivalent to np.corrcoef(x.T, y)

我提出了這些方法,所有這些方法都會導致與您提出的解決方案相同的結果:

  • 方法 1:類似於Lucas M. Uriarte提出的解決方案,使用numpy.corrcoef

     np.corrcoef(y,xT)[0][1:]
  • 方法2:使用numpy函數重寫用於計算相關性的function:

     def corr_np(data1, data2): mean1 = data1.mean() mean2 = data2.mean() std1 = data1.std() std2 = data2.std() corr = ((data1*data2).mean()-mean1*mean2)/(std1*std2) return corr def paerson_np(x, y): return np.array([corr_np(x[:, i], y) for i in range(x.shape[1])])
  • 方法3:改寫計算相關性的function,使用numba加快計算速度:

     @nb.njit() def corr_nb(data1, data2): M = data1.size sum1 = 0. sum2 = 0. for i in range(M): sum1 += data1[i] sum2 += data2[i] mean1 = sum1 / M mean2 = sum2 / M var_sum1 = 0. var_sum2 = 0. cross_sum = 0. for i in range(M): var_sum1 += (data1[i] - mean1) ** 2 var_sum2 += (data2[i] - mean2) ** 2 cross_sum += (data1[i] * data2[i]) std1 = (var_sum1 / M) **.5 std2 = (var_sum2 / M) **.5 cross_mean = cross_sum / M return (cross_mean - mean1 * mean2) / (std1 * std2) @nb.njit() def paerson_nb(x, y): return np.array([corr_nb(x[:, i], y) for i in range(x.shape[1])])

執行時間比較

我通過比較我上面列出的 3 種方法和您的解決方案(我將其稱為方法 0)來嘗試查看哪種解決方案更有效。 實驗的實例具有以下結構:

import numpy as np
import numba as nb
from scipy.stats import pearsonr

rng = np.random.default_rng(seed=42)
n = 20000
x = rng.random((n, n))
y = rng.random(n)

結果:

  • 接近 0(您的解決方案):

     %timeit approach0(x, y):-> 15.6 s ± 200 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
  • 方法一:

     %timeit np.corrcoef(y,xT)[0][1:]:-> 37.4 s ± 3.68 s per loop (mean ± std. dev. of 7 runs, 1 loop each)
  • 方法二:

     %timeit paerson_np(x, y):-> 19.1 s ± 351 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
  • 方法3:

     %timeit paerson_nb(x, y):-> 7.81 s ± 56.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

numba(方法 3)的解決方案比您的解決方案(方法 0)和 numpy 的解決方案(方法 2)快大約 2 倍。 numpy.corrcoef 的解決方案顯然是最慢的:比接近 0 和 2 慢約 2 倍,甚至比使用 numba 的解決方案慢 5 倍以上。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM