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
,就是这个!