2017-02-17 9 views
0

Что происходит, когда я делаю эту операцию в Numpy?Numpy Broadcasting

a = np.ones([500,1]) 
b = np.ones([5000,])/2 
c = a + b 

# a.shape (500,1) 
# b.shape (5000,) 
# c.shape (500, 5000) 

Мне сложно определить, что на самом деле происходит в этой трансляции.

+4

ли вы пройти через документы на вещание? – Divakar

+0

Один немного сложный бит здесь состоит в том, что по соглашению, если отсутствуют оси, как в случае вашего 'b', они добавляются как единицы в _left_. Я не знаю, имеет ли это какие-то более глубокие причины, но сохраняет C-смежность. –

ответ

1

Numpy принимает для одномерных массивов строк строк, поэтому ваше суммирование действительно между формами (500, 1) и (1, 5000), что приводит к суммированию матриц.

Поскольку это не очень понятно, вы должны расширить свои размеры в явном виде:

>>> np.arange(5)[:, None] + np.arange(8)[None, :] 
array([[ 0, 1, 2, 3, 4, 5, 6, 7], 
     [ 1, 2, 3, 4, 5, 6, 7, 8], 
     [ 2, 3, 4, 5, 6, 7, 8, 9], 
     [ 3, 4, 5, 6, 7, 8, 9, 10], 
     [ 4, 5, 6, 7, 8, 9, 10, 11]]) 
+0

«Numpy принимает для 1-мерных векторов строк массивов» - нет, это не так, или такие вещи, как '(2, 2)' shape array dot '(2,)' shape array не будут работать. 1D - 1D массивы. Различные операции могут относиться к ним аналогично строкам или столбцам в зависимости от контекста. – user2357112

+0

Точнее сказать, что '(n,)' broađcasts to '(1, n)' при необходимости. Чтобы избежать двусмысленности, расширяющейся до (n, 1), должно быть явно. – hpaulj

+0

Если вы действительно хотите быть явным, используйте 'np.newaxis' вместо' None'. –