Матрица расстояний по измерению - PullRequest
0 голосов
/ 19 февраля 2020

Предполагая, что я хочу вычислить матрицу расстояний между каждым элементом в векторе, я могу сделать это следующим образом:

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]]]

1 Ответ

1 голос
/ 19 февраля 2020

Используйте np.triu на 3D расширенной версии вычитаемых массивов -

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]]])

Или используйте trusty np.expand_dims -

np.triu(np.expand_dims(X, 1) - np.expand_dims(X, 2))

Или создайте маску triu с чем-то вроде np.tri и затем маску -

mask = ~np.tri(X.shape[-1], dtype=bool)
out = mask*(X[:,None,:]-X[:,:,None])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...