Как построить матрицу всех возможных отличий вектора в 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]])
Другие вопросы по тегам