Добавление массивов с другим количеством размеров

Скажем, я сделал, чтобы 2D Numpy выстроил:

>>> a = np.random.random((4,6))

и я хочу добавить 1D массив к каждой строке:

>>> c = np.random.random((6,))
>>> a + c

Это работает. Теперь, если я пытаюсь добавить 1D массив к каждому столбцу, я получаю ошибку:

>>> b = np.random.random((4,))
>>> a + b
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: shape mismatch: objects cannot be broadcast to a single shape

Я могу зафиксировать это при помощи np.newaxis:

>>> a + b[:,np.newaxis]

который действительно работает как ожидалось.

Что соответствующие форме правила состоят в том, чтобы избежать необходимости использовать np.newaxis? Случается так, что последний элемент кортежа формы numpy должен соответствовать? Это управляет, также относятся к более высоким размерам? Например, следующие работы:

>>> a = np.random.random((2,3,4,5))
>>> b = np.random.random((4,5))
>>> a + b

Таким образом, мой вопрос состоит в том, документируется ли это где-нибудь, и если это - поведение, на которое можно полагаться, или лучше ли всегда использовать np.newaxis?

10
задан astrofrog 20 January 2010 в 20:19
поделиться

2 ответа

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

  1. Все входные массивы с ndim меньше входного массива самого большого ndim, имеют один готовый к их формам.
  2. Размер в каждом измерении выходной формы является максимальным из всех входные размеры в этом размере.
  3. Входной параметр может быть использован при вычислении, если его размер в a определённый размер или соответствует выходной размер в этом измерении, или имеет значение ровно 1.
  4. Если вход имеет размер 1 по форме, то первый ввод данных в этом измерении будет использоваться для всех вычисления по этому размеру. На сайте . иными словами, ступенчатая техника ufunc просто не будет идти дальше. это измерение (шаг будет 0 для этого измерения).

Операция возможна (не приводит к ошибке несовпадения формы , о которой вы упоминали) в трех случаях:

  1. Массивы все имеют одинаковую форму.
  2. Массивы имеют одинаковое количество размеров, и длина каждого размера либо общая длина, либо 1.
  3. Массивы, которые имеют слишком малое количество размеров, могут иметь свою форму с размером 1, удовлетворяющим свойству 2.

Примеры можно найти по ссылке выше.

12
ответ дан 3 December 2019 в 23:12
поделиться
3665327-

Позвольте мне посмотреть, если я получу это ...

>>> from numpy import ones, newaxis
>>> A = ones((4,3))   # 4 rows x 3 cols
>>> A.shape
(4, 3)
>>> A
array([[ 1.,  1.,  1.],
       [ 1.,  1.,  1.],
       [ 1.,  1.,  1.],
       [ 1.,  1.,  1.]])
>>> 
>>> ones((4,1))      # 4 rows x 1 col
array([[ 1.],
       [ 1.],
       [ 1.],
       [ 1.]])
>>> A + ones((4,1))
array([[ 2.,  2.,  2.],
       [ 2.,  2.,  2.],
       [ 2.,  2.,  2.],
       [ 2.,  2.,  2.]])
>>> 
>>> ones((1,3))      # 1 row x 3 cols
array([[ 1.,  1.,  1.]])
>>> A + ones((1,3))  
array([[ 2.,  2.,  2.],
       [ 2.,  2.,  2.],
       [ 2.,  2.,  2.],
       [ 2.,  2.,  2.]])
>>> 
>>> B = ones((3,))   # a 1D array
>>> B
array([ 1.,  1.,  1.])
>>> B.shape
(3,)
>>> A + B
array([[ 2.,  2.,  2.],
       [ 2.,  2.,  2.],
       [ 2.,  2.,  2.],
       [ 2.,  2.,  2.]])
>>> 
>>> C = ones((4,))   # a 1D array
>>> C.shape
(4,)
>>> C
array([ 1.,  1.,  1.,  1.])
>>> A + C
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: shape mismatch: objects cannot be broadcast to a single shape
>>> 
>>> D = C[:,newaxis]
>>> D.shape
(4, 1)
>>> A + D
array([[ 2.,  2.,  2.],
       [ 2.,  2.,  2.],
       [ 2.,  2.,  2.],
       [ 2.,  2.,  2.]])

вещания, необходимое для проведения 4 х 3 вектор плюс 1D вектор с 3 элементами.

Вещание, необходимое для выполнения 4 х 3 вектор плюс 1D Vector с 4-х элементами.

>>> D = C[:,newaxis]

преобразуется C до 2D вектор совместимой формы.

2
ответ дан 3 December 2019 в 23:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: