假设有两个矩阵行数不同,维度相同,如A.shape = (500,300),B.shape = (200000,300),希望求出所有行向量之间的曼哈顿距离,输出一个矩阵M,Mij表示A中第i个行向量与B中第j个行向量的曼哈顿距离,M.shape=(500,200000)。我想到使用双循环
import numpy as np
def Manhadun(x,y):
return np.sum(np.abs(x-y))
def ManhadunMatrix(x,y):
M = np.empty((x.shape[0],y.shape[0]))
for i in range(x.shape[0]):
for j in range(y.shape[0]):
M[i][j] = Manhadun(x[i],y[j])
return M
但是双循环的速度太慢了,请问有没有更快的方法呢?直接对矩阵操作应该更快,但是没有思路。希望有人帮忙
改进了一下,应该会快一点,但测试了下也要4min多
import numpy as np
import time
def Manhadun(x,y):
return np.sum(np.abs(x-y))
def ManhadunMatrix(x,y):
M = np.empty((x.shape[0],y.shape[0]))
for i in range(x.shape[0]):
for j in range(y.shape[0]):
M[i][j] = Manhadun(x[i],y[j])
return M
def ManhadunMatrix_(x, y):
return np.array([np.sum(np.abs(x[i, :] - y), axis = 1) for i in range(x.shape[0])])
if __name__ == '__main__':
A = np.random.randn(500, 300)
B = np.random.randn(200000, 300)
start = time.time()
M1 = ManhadunMatrix_(A, B)
print(time.time() - start) # 259.9257025718689