【发布时间】:2018-05-24 00:11:56
【问题描述】:
我正在尝试实现一个有效的矢量化numpy 来制作曼哈顿距离矩阵。我熟悉用于使用点积创建高效欧几里得距离矩阵的构造,如下所示:
A = [[1, 2]
[2, 1]]
B = [[1, 1],
[2, 2],
[1, 3],
[1, 4]]
def euclidean_distmtx(X, X):
f = -2 * np.dot(X, Y.T)
xsq = np.power(X, 2).sum(axis=1).reshape((-1, 1))
ysq = np.power(Y, 2).sum(axis=1)
return np.sqrt(xsq + f + ysq)
我想实现类似的东西,但改用曼哈顿距离。到目前为止,我已经接近但未能重新排列绝对差异。据我了解,曼哈顿距离是
我试图通过考虑绝对函数是否根本不适用给我这个等价来解决这个问题
这给了我以下矢量化
def manhattan_distmtx(X, Y):
f = np.dot(X.sum(axis=1).reshape(-1, 1), Y.sum(axis=1).reshape(-1, 1).T)
return f / Y.sum(axis=1) - Y.sum(axis=1)
我认为我是正确的轨道,但我无法在不移除围绕每个向量元素之间差异的绝对函数的情况下移动值。我确信绝对值有一个聪明的技巧,可能是使用平方值的np.sqrt 或其他东西,但我似乎无法意识到这一点。
【问题讨论】:
-
曼哈顿距离与点积无关,所以任何带有
.dot的东西都不会有太大帮助。 -
您也可以尝试 e_dist 并将 sqrt 部分省略到底部。这种 einsum 方法可以在各种情况下用作 scipy cdist 和 pdist 等的替代品。stackoverflow.com/questions/42660459/…
标签: python numpy vectorization