Подтвердить что ты не робот

Добавление списка и номера NumPy

Если вы добавите целое число в список, вы получите ошибку, вызванную функцией __add__ в списке (я полагаю):

>>> [1,2,3] + 3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can only concatenate list (not "int") to list

Если вы добавите список в массив NumPy, я предполагаю, что функция __add__ массива NumPy преобразует список в массив NumPy и добавляет списки

>>> np.array([3]) + [1,2,3]
array([4, 5, 6])

Но что происходит в следующем?

>>> [1,2,3] + np.array([3])
array([4, 5, 6])

Как список знает, как обрабатывать добавление с массивами NumPy?

4b9b3361

Ответ 1

list не знает, как обрабатывать добавление с массивами NumPy. Даже в [1,2,3] + np.array([3]), это массивы NumPy, которые обрабатывают добавление.

Как задокументировано в модели данных:

  • Для объектов x и y используется первый x.__op__(y). Если это не реализовано или возвращает NotImplemented, проверяется y.__rop__(x). Если это также не реализовано или возвращает NotImplemented, TypeError исключение. Но см. Следующее исключение:

  • Исключение к предыдущему элементу: если левый операнд является экземпляром встроенного типа или класса нового стиля, а правый операнд является экземпляр соответствующего подкласса этого типа или класса и переопределяет base __rop__(), метод правых операндов __rop__()попробовал перед левым операндом метод __op__().

Когда вы делаете

[1,2,3] + np.array([3])

то, что внутренне называется

np.array([3]).__radd__([1,2,3])

Ответ 2

Это из-за метода __radd__ np.array, посмотрите эту ссылку: http://www.rafekettler.com/magicmethods.html#numeric (абзац Отраженные арифметические операторы).

В случае, когда вы пытаетесь [1,2,3].__add__(np.array([3])), он вызывает ошибку, поэтому вызывается np.array([3]).__radd__([1,2,3]).