gpt4 book ai didi

python - numpy 中的矢量化矩阵曼哈顿距离

转载 作者:太空狗 更新时间:2023-10-30 02:15:51 39 4
gpt4 key购买 nike

我正在尝试实现一个高效的矢量化 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)

我想实现类似的东西,但改用曼哈顿距离。到目前为止,我已经很接近了,但在尝试重新排列绝对差异时失败了。据我了解,曼哈顿距离是

\sum_i |x_i - y_i| = |x_1 - y_1| + |x_2 - y_2| + ...

我试图通过考虑绝对函数是否根本不适用给我这个等价来解决这个问题

\sum_i x_i - y_i = \sum_i x_i - \sum_i y_i

这给了我以下矢量化

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 或其他东西,但我似乎无法意识到这一点。

最佳答案

我认为我们不能在这里利用基于 BLAS 的矩阵乘法,因为这里不涉及元素级乘法。但是,我们别无选择。

方法 #1

我们可以使用Scipy's cdist具有曼哈顿距离,其可选度量参数设置为 'cityblock' -

from scipy.spatial.distance import cdist

out = cdist(A, B, metric='cityblock')

方法 #2 - A

我们还可以利用广播,但需要更多内存 -

np.abs(A[:,None] - B).sum(-1)

方法 #2 - B

可以重写以使用更少的内存对具有两个列的输入数组进行切片和求和 -

np.abs(A[:,0,None] - B[:,0]) + np.abs(A[:,1,None] - B[:,1])

方法 #2 - C

移植广播 版本以利用numexpr module 更快的绝对 计算| -

import numexpr as ne
A3D = A[:,None]
out = ne.evaluate('sum(abs(A3D-B),2)')

关于python - numpy 中的矢量化矩阵曼哈顿距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47736531/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com