2012-06-24 3 views
14

У меня возникли проблемы с пониманием правил для широковещания массивов в Numpy.Правила вещания в массиве Numpy

Очевидно, что если вы выполняете умножение по элементам на двух массивах одинаковых размеров и формы, все в порядке. Кроме того, если вы умножаете многомерный массив на скаляр, он работает. Это я понимаю.

Но если у вас есть два N-мерных массива разные формы, мне непонятно, в чем именно действуют правила вещания. В этом documentation/tutorial объясняется, что: Для трансляции размер задних осей для обоих массивов в операции должен быть одного размера или один из них должен быть одним.

Итак, я полагаю, на задней оси они имеют в виду 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

Это поистине хорошее объяснение - вещание, http://www.scipy.org/EricsBroadcastingDoc –

+0

Вы не могли бы помешать тегу "broadcasting" please? – denis

+0

Ссылка на комментарий @BiRico теперь http://wiki.scipy.org/EricsBroadcastingDoc Интересно, почему он был перемещен в * архивный свалку *. – iled

ответ

10

Значения оконечных осей поясняются на странице связанной документации. Если у вас есть два массива с разными размерами, скажем один 1x2x3 и другие 2x3, то вы сравниваете только общие общие размеры, в данном случае 2x3. Но если оба ваших массива двумерны, то их соответствующие размеры должны быть равны или один из них должен быть 1. Размеры, по которым массив имеет размер 1, называются сингулярными, а массив может быть передан вдоль них.

В вашем случае у вас есть 2x2 и 4x2 и 4 != 2 и ни 4 или 2 равна 1, так что это не работает.

+0

Другими словами, 'shape'' A' должен быть суффиксом 'shape'' B ', не обращая внимания на любую ось, значение 1 (?) –

+1

, если вы не считаете, что вы означают« 1 »равно чему угодно», и либо «shape (A)», либо «shape (B)» могут быть суффиксами друг друга, то да. – unkulunkulu

+1

На самом деле вы можете рассматривать любой массив как бесконечномерный размер '... x1x1x1x1x1x1x1x ..... xAxBxC', поэтому у нас есть много ведущих' 1 ', которые можно транслировать как другие. Таким образом, вы можете забыть этот материал суффикса, просто скажите, что '1' равно чему угодно. – unkulunkulu