2017-02-01 2 views
2

Я хочу рассчитать сумму расстояний вектора строк по отношению ко всем другим векторам строк в матрице. Таким образом, результат должен быть квадратной матрицей.Как применить функцию ко всем векторным парам в матрице

Для матрицы M:

| a b c | | v1 | 
M = |  | = | | 
    | c d e | | v2 | 

я хотел бы вычислить:

| (a-a)+(b-b)+(c-c) (a-c)+(b-d)+(c-e) | | v1-v1 v1-v2 | 
M = |          | = |    | 
    | (c-a)+(d-b)+(e-c) (c-c)+(d-d)+(e-e) | | v2-v1 v2-v2 | 

Я знаю, что я мог бы сделать это в гнездовой for цикле, но есть более элегантный способ применить эту или любую другую операцию, подобную этой, к матрице с numpy?

ответ

3

Использование broadcasting -

(M[:,None,:]- M).sum(2) 

Пример запуска -

In [41]: M 
Out[41]: 
array([[8, 3, 2], 
     [6, 1, 2]]) 

In [42]: (M[:,None,:]- M).sum(2) 
Out[42]: 
array([[ 0, 4], 
     [-4, 0]]) 

Если M матрица NumPy, получить представление массива в него с np.asarray(), а затем использовать его, например, так -

M_arr = np.asarray(M) 
out = np.asmatrix((M_arr[:,None,:]- M_arr).sum(2)) 

Образец прогона -

In [69]: M = np.asmatrix(np.random.randint(0,9,(2,3))) 

In [70]: M 
Out[70]: 
matrix([[3, 8, 8], 
     [0, 5, 0]]) 

In [71]: M_arr = np.asarray(M) 

In [72]: np.asmatrix((M_arr[:,None,:]- M_arr).sum(2)) 
Out[72]: 
matrix([[ 0, 14], 
     [-14, 0]]) 

Давайте также убедиться в том, что мы действительно работаем с целью там с np.asarray() -

In [73]: np.may_share_memory(M, M_arr) 
Out[73]: True 
+0

Спасибо за этот пример! :) – displayname

Смежные вопросы