python矩陣距離計算

源代碼:July在線數據分析班第一講大林老師講解python運算速度時,曾舉例到一矩陣計算速度的例子,不是python的運算速度慢,而是跟選取的方法有關,如都說C 比python快,但是用python多線程與C的單線程比,肯定是python快。
說矩陣計算的例子:正好工作中用到距離計算,試了下果然好用:
速度
課程源代碼:官網可去:https://www.julyedu.com/查詢課程資料
例子代碼求得距離方法,結果開個根號就是;

import numpy as np
import numpy.linalg as la
import time

X = np.array([range(0, 500), range(500, 1000)])
m, n = X.shape
print(m, n)#2行,500列矩陣

'''
D(i, j) = ||xi - xj||^2
'''
t = time.time()
D = np.zeros([n, n])
for i in range(n):
    for j in range(i + 1, n):
        D[i, j] = la.norm(X[:, i] - X[:, j]) ** 2
        D[j, i] = D[i, j]
print(time.time() - t)

'''
|xi - xi| = sqrt((xi - xj) * (xi - xj).T)
D(i, j) = (xi - xj) * (xi - xj).T
'''
t = time.time()
D = np.zeros([n, n])
for i in range(n):
    for j in range(i + 1, n):
        d = X[:, i] - X[:, j]
        D[i, j] = np.dot(d, d)
        D[j, i] = D[i, j]
print(time.time() - t)

'''
D(i, j) = (xi - xj) * (xi - xj).T
        = xi * xi.T - xi * xj.T - xj * xi.T + xj * xj.T
        = xi * xi.T - 2 * xi * xj.T + xj * xj.T
G(i,j) = xi.T * xj
'''
t = time.time()
G = np.dot(X.T, X)
D = np.zeros([n, n])
for i in range(n):
    for j in range(i + 1, n):
        D[i, j] = G[i, i] - G[i, j] * 2 + G[j,j]
        D[j, i] = D[i, j]
print(time.time() - t)

'''
H(i, j) = G(i, i)
K(i, j) = G(j, j) = H(i, j).T
D(i, j) = H(i, j) + K(i, j) - 2 * G(i, j)
'''
t = time.time()
G = np.dot(X.T, X)
H = np.tile(np.diag(G), (n, 1)) # n rows, 1 for each row
D = H + H.T - G * 2
print(time.time() - t)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章