Как построить матрицу всех возможных отличий вектора в numpy
У меня есть одномерный массив, скажем:
import numpy as np
inp_vec = np.array([1, 2, 3])
Теперь я хотел бы построить матрицу вида
m = [[0, 1-2, 1-3], [2-1, 0, 2-3], [3-1, 3-2, 0]]
Конечно, это можно сделать с помощью циклов for, но есть ли более элегантный способ сделать это?
5 ответов
Решение
Это похоже на работу:
In [1]: %paste
import numpy as np
inp_vec = np.array([1, 2, 3])
## -- End pasted text --
In [2]: inp_vec.reshape(-1, 1) - inp_vec
Out[2]:
array([[ 0, -1, -2],
[ 1, 0, -1],
[ 2, 1, 0]])
Объяснение:
Вы сначала измените массив в nx1
, Когда вы вычитаете одномерный массив, они оба передаются в nxn
:
array([[ 1, 1, 1],
[ 2, 2, 2],
[ 3, 3, 3]])
а также
array([[ 1, 2, 3],
[ 1, 2, 3],
[ 1, 2, 3]])
Затем вычитание выполняется поэлементно, что дает желаемый результат.
Это я тоже нашел хороший способ:
np.subtract.outer([1,2,3], [1,2,3])
import numpy as np
inp_vec = np.array([1, 2, 3])
a, b = np.meshgrid(inp_vec, inp_vec)
print(b - a)
Выход:
Array([[ 0 -1 -2],
[ 1 0 -1],
[ 2 1 0]])
Это быстрая и простая альтернатива.
import numpy as np
inp_vec = np.array([1, 2, 3])
N = len(inp_vec)
np.reshape(inp_vec,(N,1)) - np.reshape(inp_vec,(1,N))
Использование np.nexaxis
import numpy as np
inp_vec = np.array([1, 2, 3])
output = inp_vec[:, np.newaxis] - inp_vec
Вывод
array([[ 0, -1, -2],
[ 1, 0, -1],
[ 2, 1, 0]])