Правила широковещания массива
У меня возникли проблемы с пониманием правил для широковещания массивов в Numpy.
Очевидно, что если вы выполняете умножение по элементам на двух массивах одинаковых размеров и формы, все в порядке. Кроме того, если вы умножаете многомерный массив на скаляр, он работает. Это я понимаю.
Но если у вас есть два N-мерных массива разных форм, мне непонятно, что такое правила вещания. В этой документации/учебнике объясняется, что: для трансляции размер конечных осей для обоих массивов в операции должен быть одинаковым размер или один из них должен быть одним.
Хорошо, поэтому я полагаю, что на задней оси они относятся к N
в массиве M x N
. Таким образом, это означает, что если я попытаюсь умножить два 2D-массива (матрицы) с равным числом столбцов, он должен работать? Кроме этого не...
>>> from numpy import *
>>> A = array([[1,2],[3,4]])
>>> B = array([[2,3],[4,6],[6,9],[8,12]])
>>> print(A)
[[1 2]
[3 4]]
>>> print(B)
[[ 2 3]
[ 4 6]
[ 6 9]
[ 8 12]]
>>>
>>> A * B
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: shape mismatch: objects cannot be broadcast to a single shape
Поскольку оба A
и B
имеют два столбца, я бы подумал, что это сработает. Поэтому я, вероятно, что-то не понимаю о терминах "конечная ось" и как это относится к N-мерным массивам.
Может кто-нибудь объяснить, почему мой пример не работает, и что подразумевается под "задней осью"?
Ответы
Ответ 1
Ну, значение опорных осей объясняется на странице связанной документации.
Если у вас есть два массива с разными номерами измерений, скажем один 1x2x3
и другой 2x3
, тогда вы сравниваете только общие общие измерения, в данном случае 2x3
. Но если оба ваших массива двумерны, то их соответствующие размеры должны быть равны или один из них должен быть 1
. Размеры, по которым массив имеет размер 1
, называются сингулярными, а массив может быть передан вдоль них.
В вашем случае у вас есть 2x2
и 4x2
и 4 != 2
, и ни 4
, ни 2
равно 1
, поэтому это не работает.
Ответ 2
С http://cs231n.github.io/python-numpy-tutorial/#numpy-broadcasting:
Передача двух массивов вместе следует этим правилам:
-
Если массивы не имеют одинаковый ранг, перед формой массива более низкого ранга добавьте 1, пока обе фигуры не будут иметь одинаковую длину.
-
Говорят, что эти два массива совместимы в измерении, если они имеют одинаковый размер в измерении, или если один из массивов имеет размер 1 в этом измерении.
- Массивы могут передаваться вместе, если они совместимы во всех измерениях.
- После широковещания каждый массив ведет себя так, как если бы он имел форму, равную элементному максимуму форм двух входных массивов.
- В любом измерении, где один массив имел размер 1, а другой массив имел размер больше 1, первый массив ведет себя так, как если бы он был скопирован вдоль этого измерения
Если это объяснение не имеет смысла, попробуйте прочитать объяснение из документации или этого объяснения.