Это связано с правилами вещания NumPy.Цитируем руководство NumPy:
При работе с двумя массивами NumPy сравнивает их формы поэлементно.Он начинается с конечных размеров и продвигается вперед.Два измерения совместимы, когда
- они равны или
- одно из них равно 1
Первый оператор выдает ошибку, потому что NumPyсмотрит на единственное измерение, а (5000,)
и (500,)
неравны и не могут передаваться вместе.
Во втором утверждении train.reshape(-1,1)
имеет форму (5000,1)
, а test.reshape(-1,1)
имеет форму (500,1)
.Конечный размер (длина один) равен, так что все в порядке, но тогда NumPy проверяет другое измерение и 5000 != 500
, поэтому трансляция здесь не выполняется.
В третьем случае ваши операнды равны (5000,)
и(500,1)
.В этом случае NumPy разрешает трансляцию.1D-массив расширен по измерению задней длины 2D-массива.
FWIW, правила формы и вещания иногда могут быть немного хитрыми, и меня часто путают с подобными вопросами.