Скажем, я сделал, чтобы 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?
Это отличительная особенность нумпи, называемая трансляцией . При этом используются четыре правила, которые немного сложны в формулировке, но интуитивно понятны однозначно:
- Все входные массивы с
ndim
меньше входного массива самого большогоndim
, имеют один готовый к их формам.- Размер в каждом измерении выходной формы является максимальным из всех входные размеры в этом размере.
- Входной параметр может быть использован при вычислении, если его размер в a определённый размер или соответствует выходной размер в этом измерении, или имеет значение ровно 1.
- Если вход имеет размер 1 по форме, то первый ввод данных в этом измерении будет использоваться для всех вычисления по этому размеру. На сайте . иными словами, ступенчатая техника
ufunc
просто не будет идти дальше. это измерение (шаг будет 0 для этого измерения).
Операция возможна (не приводит к ошибке несовпадения формы
, о которой вы упоминали) в трех случаях:
- Массивы все имеют одинаковую форму.
- Массивы имеют одинаковое количество размеров, и длина каждого размера либо общая длина, либо 1.
- Массивы, которые имеют слишком малое количество размеров, могут иметь свою форму с размером 1, удовлетворяющим свойству 2.
Примеры можно найти по ссылке выше.
Позвольте мне посмотреть, если я получу это ...
>>> 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 вектор совместимой формы.