2017-01-15 3 views
1

Уверен, что это очень простой вопрос. Однако даже после прохождения нескольких обучающих страниц и the official documentation я не могу понять логику добавления в массивах numpy. Рассмотрим, например, следующее:Невозможно понять добавление массива numpy

In [5]: a = np.array([1, 2, 3]) 

In [6]: b = np.array([1, 2, 3, 4]) 

In [7]: a + b 
--------------------------------------------------------------------------- 
ValueError        Traceback (most recent call last) 
<ipython-input-7-f96fb8f649b6> in <module>() 
----> 1 a + b 

ValueError: operands could not be broadcast together with shapes (3,) (4,) 

Это совершенно нормально. Поскольку массивы имеют разные формы, мы не ожидаем, что будут выполняться операции «elementwise». Теперь рассмотрим следующее:

In [12]: np.array([1]) + np.array([1, 2, 3, 4]) 
Out[12]: array([2, 3, 4, 5]) 

Внезапно возникают проблемы с различными формами. Также это не похоже на «элементарное» действие для меня. Это, по-видимому, сохраняется даже в следующем случае:

In [15]: np.array([[1], [2]]) + np.array([1, 2, 3, 4]) 
Out[15]: 
array([[2, 3, 4, 5], 
     [3, 4, 5, 6]]) 

Я не могу понять логику этих выходов и ошибок.

+0

Все это основано на аксиях и на том, что внутри каждой оси массива с большей осью не должно быть более одного элемента. В противном случае они должны быть в отдельных массивах. – Kasramvd

ответ

4

Вы видите радиопередачу numpy на работе.

A numpy массив, который имеет только один элемент, будет обрабатываться как скаляр. Таким образом, ваш второй блок кода совпадает с 1 + np.array([1, 2, 3, 4]). 1 (или np.array([1])) получает широковещательную передачу в виде вектора, поэтому он работает как np.array([1,1,1,1]), и поэтому вы добавляете один к каждому из других значений.

Код в вашем третьем блоке умножает вектор-столбец (2D-массив, где первое измерение равно 1) вектором строки, создавая 2D-массив результатов. Каждый из входных массивов расширяется до размеров другого, поэтому array([[1],[2]]) имеет каждый ряд, растянутый, поэтому он работает как array([[1,1,1,1], [2,2,2,2]]), а строка array([1,2,3,4]) повторяется, чтобы стать array([[1,2,3,4],[1,2,3,4]]). Затем добавляются два массива размером 2 на 4.

1

Это эффективно пересчетка плюс массив:

In [12]: np.array([1]) + np.array([1, 2, 3, 4]) 
Out[12]: array([2, 3, 4, 5]) 

Это один работает, потому что правая рука операнд имеет две отдельные широкие строки, а левая рука одна строка:

In [15]: np.array([[1], [2]]) + np.array([1, 2, 3, 4]) 
Out[15]: 
array([[2, 3, 4, 5], 
     [3, 4, 5, 6]]) 

Это делается через broadcasting.

+0

Можете ли вы, пожалуйста, объяснить мне, что вы подразумеваете под «op is two single wide columns»? – Peaceful

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