Добавление списка и номера 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?
Ответы
Ответ 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])
.