Почему следующие операнды не могут быть переданы вместе? - PullRequest
0 голосов
/ 08 июня 2018

Массивы имеют следующие размеры: dists: (500,5000) train: (5000,) test :( 500,)

Почему первые два оператора выдают ошибкутогда как третий работает нормально?

  1. dists += train + test

Ошибка: ValueError: operands could not be broadcast together with shapes (5000,) (500,)

dists += train.reshape(-1,1) + test.reshape(-1,1)

Ошибка: ValueError: operands could not be broadcast together with shapes (5000,1) (500,1)

dists += train + test.reshape(-1,1) Это отлично работает!

Почему это происходит?

1 Ответ

0 голосов
/ 08 июня 2018

Это связано с правилами вещания NumPy.Цитируем руководство NumPy:

При работе с двумя массивами NumPy сравнивает их формы поэлементно.Он начинается с конечных размеров и продвигается вперед.Два измерения совместимы, когда

  1. они равны или
  2. одно из них равно 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, правила формы и вещания иногда могут быть немного хитрыми, и меня часто путают с подобными вопросами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...