2014-11-18 3 views
1

Я играл вокруг с NumPy и я написал простую функциюЧто на самом деле происходит, когда вещание массив NumPy

> def euclid_dist(x, y): 
... return sqrt((x-y).transpose().dot(x-y)) 

Но теперь, когда я пытаюсь

> x = arange(1,4).reshape(3,1) 
> y = array([[1,2,3],[4,5,6],[7,8,9],[10,11,12]]).transpose() 
> z = euclid_dist(x, y) 
> z 

array([[ 0.  , 0.  , 0.  , 0.  ], 
     [ 0.  , 5.19615242, 7.34846923, 9.  ], 
     [ 0.  , 7.34846923, 10.39230485, 12.72792206], 
     [ 0.  , 9.  , 12.72792206, 15.58845727]]) 

Ok ... Так, цифры по диагонали - то, что я хотел, но как насчет остальных? Что сейчас произошло?

Насколько я понимаю, x транслируется, так что это будет "что-то вроде

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

Но что происходит после этого? Это явно не элементная работа. Но если бы это применило функцию к каждой паре столбцов x и y, то не все ли строки (или столбцы) из z были бы равны (поскольку все столбцы «вещания x» равны)?

Очевидно, что я не понимаю, и я по достоинству оценю любое разъяснение.

+2

Читайте о том, как это работает, используя форму и шаги здесь. Http://scipy-lectures.github.io/advanced/advanced_numpy/index.html#life-of-ndarray – YXD

+0

Извините @senderle, один измените слишком далеко;) исправлено это – warran

+0

Прошу прощения снова @senderle, я слишком долго работал ... – warran

ответ

2

Как я понимаю ваш вопрос, вы пытаетесь сделать параллельный продукт с точкой в ​​столбце. Другими словами, для матрицы векторов a, b, c и d, вы хотите принять это:

[[a1, b1, c1, d1], 
[a2, b2, c2, d2], 
[a3, b3, c3, d3]] 

Для этого:

[a1 * a1 + a2 * a2 + a3 * a3, 
b1 * b1 + b2 * b2 + b3 * b3, 
c1 * c1 + c2 * c2 + c3 * c3, 
d1 * d1 + d2 * d2 + d3 * d3] 

В самом деле, ваше понимание вещания выглядит хорошо. Это dot, который не работает так, как вы ожидаете, - это умножение матрицы. Таким образом, вы получаете следующие результаты (в зависимости от того, как вы транспонирования):

>>> sqrt((x - y).T.dot(x - y)) 
array([[ 11.22497216, 11.22497216, 11.22497216], 
     [ 11.22497216, 11.22497216, 11.22497216], 
     [ 11.22497216, 11.22497216, 11.22497216]]) 
>>> sqrt((x - y).dot((x - y).T)) 
array([[ 0.  , 0.  , 0.  , 0.  ], 
     [ 0.  , 5.19615242, 7.34846923, 9.  ], 
     [ 0.  , 7.34846923, 10.39230485, 12.72792206], 
     [ 0.  , 9.  , 12.72792206, 15.58845727]]) 

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

>>> sqrt(((x - y) * (x - y)).sum(axis=1)) 
array([ 0.  , 5.19615242, 10.39230485, 15.58845727]) 

Короче говоря, вы на самом деле хотите не вещать в данном конкретном случае.

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