То, что вы делаете, это добавление новой оси: ось "колонна". b
раньше такого не было, так что теперь это вектор столбца, и он будет добавлен по столбцам; по сути, он будет действовать так, как если бы он повторялся в столбцах, а a
повторялся в строках:
a+b[:, None] = [1,2] + [[3], = [[1,2], + [[3],[3],
[4]] [1,2]] [4],[4]]
А вот как / почему:
Перво-наперво: numpy
делает поэлементное сложение и умножение по умолчанию. Это означает, что если a=np.array([1,2])
, то a+2=np.array([1+2,2+2])=np.array([3,5])
.
import numpy as np
A = np.array([[1, 2],
[3, 4]])
B = np.array([[1,1],
[0,0]])
Здесь A+B
будет поэлементным, и мы получим
A+B = [[1+1,2+1], = [[2,3],
[3+0,4+0]] = [3,4]]
Если мы транспонируем матрицу B
(используя B.T
)
сейчас B.T
будет иметь значение
B.T= np.array([[1,0],
[1,0]])
И если мы сделаем это поэлементно, на этот раз мы получим:
A+B.T=[[1, 2] + [[1,0] = [[2,2],
[3, 4]] [1,0]] [4,4]]
Следует также отметить, что (B
не транспонирован)
a = np.array([1,2])
B+a = [[1,2], + [[2, 3],
[1,2]] [1, 2]]
И это тоже поэлементно, но в обоих рядах! То есть a
было практически "повторено", чтобы иметь две строки, и добавлено поэлементно к B
.
Далее, Numpy docs говорит, что None
в разрезании - это другой способ написания np.newaxis
. В вашем случае, опция None
в нарезке в основном транспонирует b
-вектор перед добавлением!
Точно такой же результат мог быть получен
import numpy as np
a = np.array([1, 2])
b = np.array([3, 4])
c=a+b.reshape(2,1)
d=a+b.reshape(-1,1)
e=a+b[:, np.newaxis]
Здесь c
, d
и e
имеют одинаковые значения!