給定兩個矩陣,我想為每一行的平方差之和創建一個新陣列,但我似乎找不到方法。
為了更清楚我的意思,讓我們舉個例子。我想在numpy矩陣計算中做如下for-loop:
a = np.array([0.0, 0。 0, 0.0], [1.0, 1.0, 1.0]] )
b = np.array([[1.2, 2.3, 3.4], [4.5, 5. 6, 7.8], [9.10, 10.11, 11.12]]
summed = np.ones((2,3)
for i, aSample in enumerate(a)。
for j, bSample in enumerate(b):
summed[i, j] = np.sum(np.power(aSample - bSample, 2)
>>>summed
array([[ 18.29 , 112.45 , 308.6765] 。
[7.49 , 79.65 , 251.0165]])
這些只是矩陣的例子,在我的用例中,這兩個矩陣都有超過幾萬行的記錄。所以這些矩陣的形狀更像是(20000,1000)。有什么方法可以用numpy有效地做到這一點嗎?
編輯。 @Blorgon 提供了正確的結果,但在我的情況下,我無法用 np.newaxis 分配更大的矩陣。一位@MadPhysicist的解決方案在記憶體限制內成功計算出了向量的距離。
uj5u.com熱心網友回復:
你可以使用np.newaxis來實作你想要的結果:
>>> np. sum(np.power(b - a[:, np.newaxis], 2), axis=2)
array([[ 18.29 , 112.45 , 308.6765]。
[7.49 , 79.65 , 251.0165]])
編輯:雖然我的解決方案更快,但如果記憶體很重要,那么scipy的解決方案會更好。
uj5u.com熱心網友回復:
由blorgon建議的numpy解決方案可能更快,但你也可以使用scipy.spatial.distance.cdist:
>>> from scipy.spatial.distance importcdist
>>> cdist(a, b)**2
array([[ 18.29 , 112.45 , 308.6765] 。
[7.49 , 79.65 , 251.0165]])
這種方法的問題是,它需要一個平方根,然后撤銷它。其優點是它不使用一個大的中間陣列。你可以像這樣在numpy中避免一些中間數:
diff = b - a[:, np.newaxis]
np.power(diff, 2, out=diff).sum(axis=2)
array([[ 18.29 , 112.45 , 308.6765] 。
[7.49 , 79.65 , 251.0165]])
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/309485.html
標籤:
