向量化马氏距离- numpy

n6lpvg4x  于 2023-05-07  发布在  其他
关注(0)|答案(1)|浏览(117)

我一直在看@Danita的答案(Vectorizing code to calculate (squared) Mahalanobis Distiance),它使用np.einsum来计算马氏距离的平方。在这种情况下,向量为:X的形状(m, n)U的形状(k, n),和T的形状(k, n, n),那么我们可以写为:

diff = X[np.newaxis, :, :] - U[:, np.newaxis, :]
D = np.einsum('jik,jkl,jil->ij', diff, T, diff)

我想做的是给XT添加一个维度。确切地说,在我的例子中,形状为(m, n)X,形状为(l, k, n)U,形状为(l, k, n, n)T。所以结果D的形状应该是(l, m, k)
然而,由于我没有完全理解np.einsum,我对我的案例做了噩梦。有人能帮忙吗?

kfgdxczn

kfgdxczn1#

我想你问的是broadcasting。在np.einsum docs中,它说可以使用省略号来控制广播。通过将...添加到您的下标,您可以指定希望它如何广播操作。像这样的东西应该做你想要的:

diff = X[np.newaxis, :, :] - U[:, :, np.newaxis, :]
D = np.einsum('...jik,...jkl,...jil->...ij', diff, T, diff)

注意:您在问题中说要将维度添加到XT,但您似乎将其添加到UT。我的答案是后者。如果这是错误的,你必须切换diff = ...中的额外轴。

相关问题