2013-12-13 16 views
5

Warum numpy keinen Fehler auslösen, wenn Sie so etwas tunWarum können Sie mit numpy Arrays unterschiedlicher Größe hinzufügen?

np.ones((5,5)) + np.ones(5) 

Ein solcher Zusatz ist in der linearen Algebra nicht klar definiert, und es dauerte nur einige Stunden einen Fehler auf die Spur, die zu diesem

kocht
+8

(http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html) –

+0

Eine solche Funktion (Smart Array hinaus) ist sehr nützlich bei der Programmierung [NumPy Rundfunk Regeln sehen] .. und es wurde in numpy implementiert. Seien Sie nicht überrascht, aber 'a' + 'b' = 'ab' und 'a' * 3 = 'aaa' - diese Funktion ist auch praktisch ... – bubble

+2

eine Ausnahme zu werfen ist auch nicht in der linearen Algebra definiert –

Antwort

4
np.ones((5,5)) + np.ones(5) 
np.ones((5,5)) + np.ones(4) <- This would give a error. 

seit np.ones (5), um die Größe jeder Zeile passen sie eine elementweise Ergänzung zu jeder Zeile.

So einfach funktioniert numpy. Ich bin kein lineares Algebra-Modul.

Hier ist ein kurzes Beispiel, wie Sie es tun könnten, dies muss erweitert werden, mit mehr Logik und Cleverness. Nur ein Beweis für das Konzept.

import numpy as np 

class myMatrixClass(np.ndarray): 
    def __add__(self,val): 
     if (hasattr(val, '__iter__') and self.shape != val.shape): 
      print "not valid addition!" 
     else: 
      return super(myMatrixClass, self).__add__(val) 

In [33]: A = myMatrixClass(shape=(5,5)) 

In [34]: A[:] = 1 

In [35]: B = A + 1 

In [36]: B 
Out[36]: 
myMatrixClass([[ 2., 2., 2., 2., 2.], 
     [ 2., 2., 2., 2., 2.], 
     [ 2., 2., 2., 2., 2.], 
     [ 2., 2., 2., 2., 2.], 
     [ 2., 2., 2., 2., 2.]]) 

In [37]: C = A + np.ones(5) 
not valid addition! 
+3

ein guter Weg, um die elementweise Addition zu visualisieren ist: 'np.ones ((5,5)) + np.arange (5)' –

+1

Es ist auch sehr praktisch, sagen Sie, wenn Sie ein 3xN-Array haben und möchte den Mittelwert (einen 3x1-Vektor) aus jeder Zeile entfernen. –

+0

Wenn Sie möchten, dass der Fehler ausgelöst wird, müssten Sie wahrscheinlich das numpy-Array ableiten und alle Operatorfunktionen mit der Größenprüfung neu definieren, um am Ende die ursprünglichen Operatorfunktionen aufzurufen, wenn sie den Test bestehen – M4rtini

0

Ich glaube, das ist, weil numpy kleinere Arrays ausstrahlt, um die Form des größeren Arrays zu passen. Siehe: http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html

Dies muss jedoch nicht unbedingt mit "normaler linearer Algebra" übereinstimmen.

es sehr gut in der obigen doc exaplined wird:

a = np.array([1.0, 2.0, 3.0]) 
b = 2.0 
a * b 

Ergebnisse in:

array([ 2., 4., 6.]) 
+2

Nicht sicher was du mit deinem letzten Beispiel sagen willst. Die Multiplikation eines Vektors mit einem Skalar ist natürlich in der linearen Algebra vollkommen gültig. –

+0

Natürlich ist es! Das Beispiel von direkt aus der numpy docs :) –

+2

Ok, sah es an. Auch wenn es wahr ist, ist es nicht wirklich das informativste Beispiel für die Anzahl der Übertragungsregeln: P –

Verwandte Themen