假設集合a有m個向量,集合b有n個向量。所有向量的維度都是d維。
如何求這m個向量與這n個向量的距離(共m*n個距離)?
一般,我們會想到使用兩重迴圈的方式來求。
for i in range(m):
for j in range(n):
dist[i][j] = ...
但是比較耗時。
我們可以使用矩陣運算來解決。
表示成矩陣形式為:p(m*d矩陣)、c(n*d矩陣)。 結果dist應該是m*n的矩陣。
首先,看一下dist(i,j)的結果。
dist(i,j)應該為p的第i行與c的第j行的距離。
因此,總的dist^2為:
而這四個矩陣都可以比較容易的得到。
import numpy as np
def compute_distances(p, c):
a = (p**2).sum(axis=1, keepdims=true) #先對p求平方;然後按行求和,並且保持維度。得到乙個5行1列的向量。
b = (c**2).sum(axis=1, keepdims=true).t #得到乙個1行4列的向量。
return np.sqrt(a + b - 2* np.dot(p, c.t)) #a+b會廣播運算加法。np.dot()是矩陣相乘。
if __name__ == "__main__":
p = np.random.randint(1, 5, (5, 3)) #5行3列。5個三維向量。
c = np.random.randint(1, 5, (4, 3)) #4行3列。4個三維向量。
dist = compute_distances(p, c)
print(p)
print(c)
print(dist)
結果:
驗證一下,比如p1與c1的距離為:sqrt(9+0+0) = 3,正確。 p5與c4的距離為sqrt(1+1) = 1.414,正確。
位運算計算方式與例項
1.非 是乙個單目運算子,只有乙個運算物件。0變成1,1變成0。例如 二進位制1000 1101 進行位邏輯非運算為 0111 0010,對應十進位制 141等於 142。正數取反 對應的負數 1 負數取反 對應的正數 1 例如 14 15 14 13 2.與 將兩個物件按位與運算,1與1等於1,1...
減一與運算計算漢明重量
刷leetcode還是能學到很多小知識的,今天學到了如何在二進位制數中快速輸出有幾個1,二進位制中1的個數也稱為漢明重量 思路很簡單 1 設個數為0,原始資料是n 2 如果n等於0,輸出個數,如果不等於零,n n n 1 3 個數加1,迴圈 2 舉個例子就很清楚了 n 01001 n n n 1 0...
四則運算計算器
今天做個帶視窗的c 四則運算計算器 輸入中綴表示式 自然表示式 可以用list來放 先把它變成字尾表示式 逆波蘭表示式 用乙個棧放運算子,另乙個棧放字尾表示式 運算子優先順序 1 2 3 4 從左到右遍歷中綴表示式 計算字尾表示式 從左到右掃瞄字尾表示式,如果是數字,放入數字棧。如果是符號,從數字棧...