2017-06-21 3 views
0

Ich habe zwei numpy Arrays:wenn Gebrauch * über numpy.array und numpy.matrix

a = np.array([1, 2, 3]).reshape(3, 1) 
b = np.array([4, 5]).reshape(2,1) 

Wenn ich a*b.T, ich eine falsche Ausgabe denke, da gibt es einen Unterschied in ihren Formen ist (unter Verwendung von * führt elementweise Multiplikation für ein Array). Aber das Ergebnis kehrt Matrixmultiplikation, wie folgt aus:

[[ 4, 5], 
[ 8, 10], 
[12, 15]] 

# this shape is (3, 2) 

Warum es so funktioniert?

+1

Wenn Sie a nach (3,1) und b nach (2,1) umgeformt haben. Dann sollte a * b.T zu (3,2) führen. 'a * b.T ~ = (3,1) * (1,2)'. Innere Dimensionen stimmen überein. Die resultierende Matrix wird also die äußeren Dimensionen 3 und 2 sein. Daher (3,2) – nikpod

+0

Ich weiß, du meinst, aber wenn verwendet * bedeutet elementweise Multiplikation über Array, a & b sie Typ ist Array. Zum Beispiel wenn Sie c (Array-Typ) Shape ist (2, 3) * d (Array-Typ) Shape ist (3, 2) ist falsch, weil sie Form ist Unterschied. @ Nikod –

Antwort

1

Ihre a * b.T ist Element Multiplikation und funktioniert wegen broadcasting. Addition und viele andere binäre Operationen arbeiten mit diesem Formenpaar.

a ist (3,1). b.T ist (1,2). Rundfunk verbindet (3,1) mit (1,2), um (3,2) zu erzeugen. Die Dimension der Dimension 1 wird angepasst, damit sie mit der anderen Dimension ungleich null übereinstimmt.

Sofern Sie keine Arrays mit np.matrix erstellen, führt * keine mathematische matrix multiplication. np.dot wird verwendet, um dies durchzuführen (@ und np.einsum auch dies tun).

Mit dieser besonderen Kombination von Formen ist das dot Produkt das gleiche. np.outer(a,b) produziert auch dies, die mathematische outer product. np.dot entspricht der letzten Dimension von a mit der 2. bis letzten Dimension von b.T. In diesem Fall sind sie beide 1. dot ist interessanter, wenn die gemeinsame Dimension mehrere Elemente hat, die bekannte sum of products produzieren.

In [5]: np.dot(a, b.T) 
Out[5]: 
array([[ 4, 5], 
     [ 8, 10], 
     [12, 15]]) 

'äußeren' hinaus:

In [3]: a + b.T 
Out[3]: 
array([[5, 6], 
     [6, 7], 
     [7, 8]]) 

Es kann bei a und b wie folgt aussehen helfen:

In [7]: a 
Out[7]: 
array([[1], 
     [2], 
     [3]]) 
In [8]: b 
Out[8]: 
array([[4], 
     [5]]) 
In [9]: b.T 
Out[9]: array([[4, 5]]) 

ich matrix nicht verwenden in der Regel über numpy Arrays zu sprechen es sei denn, sie werden mit np.matrix oder häufiger scipy.sparse erstellt. numpy Arrays können 0d, 1d, 2d und höher sein. Ich achte mehr auf die Form als auf die Namen.

+0

Yup, genau das, was ich gerade dachte aus der Dokumentation. Broadcasting ist der Grund, warum OP diese Ausgabe bekommt. – nikpod

+0

sehr schön, danke –

Verwandte Themen