То, с чем вы только что столкнулись, называется свойством выравнивания по правому краю numpy массивов. Если у вас есть вектор формы (n, )
и некоторый другой массив формы (a, b, c, d, ..., z)
, numpy всегда будет пытаться транслировать вектор для формы (1, 1, ...., n)
и, наконец, проверить, транслируется ли n
с z
(в другими словами, z
- это кратное n
).
Теперь, если вам не нужно поведение, вам придется явно сказать numpy, как вы хотите транслировать с помощью другой массив, с которым вы работаете, добавив ось к вектору, используя np.newaxis
. Вы также можете использовать функцию np.broadcast_arrays
для получения широковещательных массивов.
Например,
import numpy as np
a = np.array([1, 2, 3])
b = np.eye(3)
# broadcasts a to shape (1, 3) first
# adds the vector a to rows of b
# [[1, 0, 0] [[1, 2, 3]
# [0, 1, 0] + [1, 2, 3]
# [0, 0, 1]] [1, 2, 3]]
print(a + b)
# Tell numpy explicitly, how you want
# your vector to be broadcasted
# Now, a is first broadcasted to shape (3, 1)
# and the vector a is added to the columns of b
# [[1, 0, 0] [[1, 1, 1]
# [0, 1, 0] + [2, 2, 2]
# [0, 0, 1]] [3, 3, 3]]
print(b + a[np.newaxis, :])