2014-05-09 14 views
5

Ich habe zwei 1d Vektoren (sie können auch 2d Matrizen in einigen Fällen sein). fand ich die Punktfunktion für Skalarprodukt aber wenn ich will, mit diesen Formen a.dot (b) multiplizieren:Multiplikation von 1d Arrays in numpy

a = [1,0.2,...] 
a.shape = (10,) 
b = [2.3,4,...] 
b.shape = (21,) 
a.dot(b) and I get ValueError: matrices not aligned. 

und ich will

c = a.dot(b) 
c.shape = (10,21) 

Irgendwelche Ideen tun, wie es zu tun ? Ich habe auch die Transponierfunktion ausprobiert, funktioniert aber nicht.

Antwort

19

Lets mit zwei Arrays starten:

>>> a 
array([0, 1, 2, 3, 4]) 
>>> b 
array([5, 6, 7]) 

Transponieren entweder Array funktioniert nicht, weil es nur 1D- gibt es nichts zu transponieren, anstatt eine neue Achse hinzufügen müssen:

>>> b.T 
array([5, 6, 7]) 
>>> b[:,None] 
array([[5], 
     [6], 
     [7]]) 

um das Punktprodukt zu arbeiten, wie gezeigt zu bekommen Sie gewundenen etwas hätte tun:

>>> np.dot(a[:,None],b[None,:]) 
array([[ 0, 0, 0], 
     [ 5, 6, 7], 
     [10, 12, 14], 
     [15, 18, 21], 
     [20, 24, 28]]) 

Sie können statt dot auf Rundfunk verlassen:

a[:,None]*b 

Oder Sie können einfach äußere verwenden:

np.outer(a,b) 

Alle drei Optionen zurück das gleiche Ergebnis.

könnten Sie auch so etwas wie dies interessiert sein, so dass jeder Vektor immer ein 2D-Array ist:

np.dot(np.atleast_2d(a).T, np.atleast_2d(b)) 
+0

Ich hoffe, dass es möglich sein wird, auf einfache .dot Funktion nur nennen jetzt, weil ich die 1d unterscheiden Vektor und Matrix. – Cospel

+1

@Cospel Siehe meine aktualisierte Antwort, kann es für Sie hilfreich sein. Alles was es tut ist die Abstraktion der if-Anweisungen, aber es kann Ihr Problem auf eine einzige Zeile reduzieren. – Daniel

+0

danke, das ist was ich brauche – Cospel