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

2024-09-21 03:20:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试实现一个有效的矢量化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或其他东西,但我似乎没有意识到这一点。


Tags: 距离returndefnp矩阵sqrt矢量化dot
1条回答
网友
1楼 · 发布于 2024-09-21 03:20:58

我不认为我们可以在这里利用基于BLAS的矩阵乘法,因为这里没有涉及到元素的乘法。但是,我们没有其他选择。

接近#1

我们可以使用Scipy's ^{},它的特征是曼哈顿距离,可选的度量参数设置为'cityblock'-

from scipy.spatial.distance import cdist

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

接近#2-A

我们也可以利用broadcasting,但是需要更多的内存-

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

broadcasting版本上进行移植,以便使用^{} module-进行更快的absolute计算

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

相关问题 更多 >

    热门问题