我正在尝试实现一个有效的矢量化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
或其他东西,但我似乎没有意识到这一点。
我不认为我们可以在这里利用基于BLAS的矩阵乘法,因为这里没有涉及到元素的乘法。但是,我们没有其他选择。
接近#1
我们可以使用Scipy's ^{} ,它的特征是曼哈顿距离,可选的度量参数设置为
'cityblock'
-接近#2-A
我们也可以利用
broadcasting
,但是需要更多的内存-接近#2-B
它可以重新编写,以便使用更少的内存对具有两个列的输入数组进行切片和求和-
接近#2-C
在} module -进行更快的
broadcasting
版本上进行移植,以便使用^{absolute
计算相关问题 更多 >
编程相关推荐