我一直在看@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)
我想做的是给X
和T
添加一个维度。确切地说,在我的例子中,形状为(m, n)
的X
,形状为(l, k, n)
的U
,形状为(l, k, n, n)
的T
。所以结果D的形状应该是(l, m, k)
,
然而,由于我没有完全理解np.einsum
,我对我的案例做了噩梦。有人能帮忙吗?
1条答案
按热度按时间kfgdxczn1#
我想你问的是broadcasting。在
np.einsum
docs中,它说可以使用省略号来控制广播。通过将...
添加到您的下标,您可以指定希望它如何广播操作。像这样的东西应该做你想要的:注意:您在问题中说要将维度添加到
X
和T
,但您似乎将其添加到U
和T
。我的答案是后者。如果这是错误的,你必须切换diff = ...
中的额外轴。