2014-09-26 1 views
2

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

Конечно, это можно сделать с помощью циклов, но есть ли более элегантный способ сделать это?

ответ

2

Это похоже на работу:

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. При вычитать 1D массив, они оба вещания на nxn:

array([[ 1, 1, 1], 
     [ 2, 2, 2], 
     [ 3, 3, 3]]) 

и

array([[ 1, 2, 3], 
     [ 1, 2, 3], 
     [ 1, 2, 3]]) 

Тогда вычитание осуществляется поэлементно, что дает желаемый результат.

+0

Привет, спасибо за ответ и объяснение, однако вы можете указать мне на какую-то ссылку объяснение расширение от nx1 до nxn. Это немного загадочно. Также, как узнать, что вычитание производится по столбцу. Спасибо – user3176500

+0

@ user3176500 Я думаю, это не совсем правильно сказать, что вычитание производится по столбцам или по ряду строк, см. Редактирование. Для краткого объяснения правил проверьте [этот учебник] (http://wiki.scipy.org/Tentative_NumPy_Tutorial#head-c533fb9a3f1aa90d96e4d8329c1c2f975474c8bf). –

+0

извините, пропустили «они оба транслируются до nxn». Конечно, вычитание производится по элементам. Еще раз спасибо – user3176500

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

Это я найти хороший способ, а также:

np.subtract.outer([1,2,3], [1,2,3]) 
Смежные вопросы