Что означает, что форма может быть «транслируемой» для другой в numpy? - PullRequest
0 голосов
/ 20 февраля 2020

Я пытаюсь повторить numpy поведение в другой библиотеке. Одна из вещей, которой не хватает моей библиотеке - это трансляция поведения. Поведение широковещания для операторов довольно хорошо определено с операторами не-присваивания в numpy, документация с указанием :

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

  1. равны или
  2. одно из них равно 1

Легко для a * b, но что о a * = b или a [:] = b? Похоже, что назначение в numpy соответствует некоторым правилам вещания, ie:

a = np.array([[1,2,3],[4,5,6],[7,8,9]])
a = a.reshape(3,1,1,3)
b = np.array([[1,2,3],[4,5,6],[7,8,9]])
b = b.reshape(1,1,3,3)

c = a * b # works!
a *= b # fails, non-broadcastable output operand with shape (1,1,3,3) doesn't match the broadcast shape (3,1,1,3)
a[:] = b #fails, could not broadcast input array from shape (1,1,3,3) into to shape (3,1,1,3)
b[:,:,:] = a[1,0,0,:] # works!

Теперь я могу интуитивно понять некоторые правила, почему это не будет смысл для некоторых из этих заданий. Проблема в том, что я не вижу ни одного набора правил, регулирующего вещание при назначении в целом. Я предполагаю, что это как-то связано с соответствием формы выходного местоположения, хотя даже этот logi c не удался в последнем рабочем примере (где они этого не сделали). Самая близкая вещь, которую я могу найти, - это один оператор в документе (выделение мое):

Как уже упоминалось, можно выбрать подмножество массива для назначения с использованием одного индекс, срезы и массивы индекса и маски. Значение, присваиваемое индексированному массиву, должно быть согласованным по форме ( такой же формы или передаваться в форму, которую индекс создает ). Например, разрешено присваивать константу срезу:

Какое здесь определение "форму к вещанию"?

1 Ответ

1 голос
/ 20 февраля 2020

(1,1,3,3) в форму (3,1,1,3)

b с формой (1,1,3,3) может вещать на (3,1,3,3), но не на (3,1,1,3). 3-й размер - 3, и его нельзя изменить на 1.

При выполнении a*= и a[:]= форма a не изменяется.

a[1,0,0,:] - это (1,1,3), которое может транслироваться на (1,1,1,3) и далее на (1,1,3,3).

С c = a*b, широковещательная рассылка:

(3,1,1,3) * (1,1,3,3) => (3,1,3,3)

Один дим a увеличивается до 3, другой дим b также увеличивается до 3. С двоичным оператором * передаются оба аргумента. В назначении только RHS - это.

...