Python 沿维度的距离矩阵
假设我想计算向量中每个元素之间的距离矩阵,我可以通过以下方式进行计算:Python 沿维度的距离矩阵,python,numpy,Python,Numpy,假设我想计算向量中每个元素之间的距离矩阵,我可以通过以下方式进行计算: X = np.array([1, 2, 3]) dist = np.triu(np.expand_dims(X, 0) - np.expand_dims(X, 1)) # [[0 1 2] # [0 0 1] # [0 0 0]] 但是,如果X是一个矩阵,并且我想计算每个向量的成对距离,我不确定该如何做。例如,假设我有以下矩阵: X = np.array([[1, 2, 3], [1, 5, 7],[7, 8, 9]]
X = np.array([1, 2, 3])
dist = np.triu(np.expand_dims(X, 0) - np.expand_dims(X, 1))
# [[0 1 2]
# [0 0 1]
# [0 0 0]]
但是,如果X
是一个矩阵,并且我想计算每个向量的成对距离,我不确定该如何做。例如,假设我有以下矩阵:
X = np.array([[1, 2, 3], [1, 5, 7],[7, 8, 9]])
我希望得到以下输出:
# [[[0 1 2],
# [0 0 1],
# [0 0 0]],
#
# [[0 4 6],
# [0 0 2],
# [0 0 0]],
#
# [[0 1 2],
# [0 0 1],
# [0 0 0]]]
在
3D
扩展数组减法版本上使用np.triu
-
In [57]: np.triu(X[:,None,:]-X[:,:,None])
Out[57]:
array([[[0, 1, 2],
[0, 0, 1],
[0, 0, 0]],
[[0, 1, 2],
[0, 0, 1],
[0, 0, 0]],
[[0, 1, 2],
[0, 0, 1],
[0, 0, 0]]])
或者使用您信任的np。展开\u dims
-
np.triu(np.expand_dims(X, 1) - np.expand_dims(X, 2))
或者用类似于np.tri
的东西创建一个triu
掩码,然后再创建一个掩码-
mask = ~np.tri(X.shape[-1], dtype=bool)
out = mask*(X[:,None,:]-X[:,:,None])
令人惊叹的第一个变体也很容易翻译成
PyTorch
,就是这个!