我需要計算兩個不同矩陣的每一行之間的協方差,即第一個矩陣的第一行與第二個矩陣的第一行之間的協方差,以此類推,直到兩個矩陣的最后一行。我可以在沒有NumPy的情況下使用下面的代碼,我的問題是:是否可以避免使用 "for回圈",而用NumPy得到同樣的結果?
m1 = np. array([[1,2, 3], [2,2,2]])
m2 = np.array([[2.56, 2.89, 3. 76],[1,2,3.95]] )
輸出 = []
for a,b in zip(m1,m2)。
cov = np.cov(a, b)
output.append(cov[0] [1])
print(output)
預先感謝!
uj5u.com熱心網友回復:
如果你要處理大的陣列,我會考慮這樣做:
from numba import jit
import numpy as np
m1 = np.random.rand(10000, 3)
m2 = np.random.rand(10000, 3)
def nb_cov(a, b)。
return [np.cov(x)[0,1] for xin np. stack((a, b), axis=1) ]
為了得到一個運行時間為
的資料>>> %timeit nb_cov(m1, m2)
最慢的運行花了94.24倍于最快的。這可能意味著一個中間結果被快取了。
1回圈,是5中最好的。10.5 ms per loop
與
相比>>> %timeit [np. cov(x)[0,1] for x in np.stack((m1, m2), axis=1) ]
1回圈,最好是5。410 ms per loop
uj5u.com熱心網友回復:
你可以使用一個串列理解來代替for回圈,你可以通過沿第三個維度連接兩個陣列來消除zip(如果你想)。
import numpy as np
m1 = np. array([[1,2, 3], [2,2,2]])
m2 = np.array([[2.56, 2.89, 3. 76], [1,2,3.95]])
# 對壓縮陣列的串列理解。
out2 = [np. cov(a, b)[0][1] for a, b in zip(m1, m2)]
print(out2)
# [0.599999999999, 0.0]/span>
# 對連接的陣列進行串列理解。
big_array = np.concatenate((m1[:, np.newaxis, :),
m2[:, np.newaxis, :]), axis=1)
out3 = [np.cov(X)[0][1] for X in big_array]
print(out3)
# [0.59999999999999, 0.0]
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/326875.html
標籤:
