2015-10-15 18 views
11

Wenn Sie eine ganze Zahl zu einer Liste hinzuzufügen, erhalten Sie einen Fehler, der durch die __add__ Funktion der Liste angehoben bekommen (nehme ich an):Zugabe von Liste und NumPy Nummer

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

Wenn Sie eine Liste zu einem NumPy hinzufügen Array, gehe ich davon aus, dass die __add__ Funktion des NumPy Array die Liste in eine NumPy Array konvertiert und fügt die Listen

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

Aber was geschieht in der folgenden?

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

Wie weiß die Liste, wie man mit NumPy-Arrays umgehen kann?

+7

* "Wie weiß die Liste, wie man die Addition mit numpy Arrays behandelt." * - tut es nicht, '[1,2,3] .__ add __ (np.array ([3]))' wird fehlschlagen, aber Python kehrt die Argumente um, wenn der erste Versuch fehlschlägt und 'np.array ([3]) .__ radd __ ([1,2,3])' ('__add__' wird aufgerufen, wenn' __radd__' nicht definiert ist). – jonrsharpe

+1

@jonrsharpe Soll nicht eher '__radd__' heißen? – Christoph

+1

@Christoph wenn es definiert ist, ja; geklärt – jonrsharpe

Antwort

12

list weiß nicht, wie man mit NumPy-Arrays umgehen kann. Selbst in [1,2,3] + np.array([3]) sind es NumPy-Arrays, die die Addition handhaben.

Als documented in the data model:

  • Für Objekte, x und y, wird zuerst versucht x.__op__(y). Wenn dies nicht implementiert ist oder NotImplemented zurückgibt, wird y.__rop__(x) ausprobiert. Wenn dies auch nicht implementiert ist oder NotImplemented zurückgibt, wird eine TypeError Ausnahme ausgelöst. Aber sehen Sie die folgende Ausnahme:

  • Ausnahme zum vorherigen Element: Wenn der linke Operand eine Instanz eines integrierten Typs oder einer neuen Stilklasse ist, und der rechte Operand ist eine Instanz einer richtigen Unterklasse von dieser Typ oder Klasse und überschreibt die Basis __rop__() Methode, die __rop__() Methode des richtigen Operanden ist vor dem linken Operanden __op__() Methode versucht.

Wenn Sie das tun

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

was intern genannt wird, ist

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

es wegen der __radd__ Methode der np.array ist, überprüfen Sie diesen Link aus: http://www.rafekettler.com/magicmethods.html#numeric (Absatz Reflektierte arithmetische Operatoren).

In Fakten, wenn Sie versuchen, [1,2,3].__add__(np.array([3])), es wird ein Fehler ausgelöst, so np.array([3]).__radd__([1,2,3]) heißt.