2017-01-25 1 views
0

Ich habe versucht, Matrix-Dot-Produkt zu tun und mit Numpy zu transponieren, und ich fand Array kann viele Dinge Matrix tun können, wie Punkt Produkt, Punkt Produkt und transponieren.Unterschiede zwischen Array-Klasse und Matrix-Klasse in numpy für Matrix-Operation

Wenn ich eine Matrix erstellen muss, muss ich zuerst ein Array erstellen.

Beispiel:

import numpy as np 

array = np.ones([3,1]) 

matrix = np.matrix(array) 

Da I transponierte Matrix tun kann und Skalarprodukt in Array-Typ, ich habe nicht Array in Matrix konvertieren Matrixoperationen zu tun.

Zum Beispiel kann die folgende Zeile gültig ist, wobei A ein ndarray:

dot_product = np.dot(A.T, A) 

Die vorherige Matrixoperation mit Matrix Klassenvariable A

dot_product = A.T * A 

Die ausgedrückt werden operator * ist genau dasselbe wie ein punktweises Produkt für ndarray. Daher macht es ndarray und Matrix fast ununterscheidbar und verursacht Verwechslungen.

Die Verwirrung ist ein ernstes Problem, wie in REP465 sagte

Schreiben von Code mit numpy.matrix funktioniert auch gut. Aber Ärger beginnt als bald, wenn wir versuchen, diese zwei Teile des Codes zusammen zu integrieren. Code , der ein ndarray erwartet und eine Matrix abruft oder umgekehrt, kann abstürzen oder falsche Ergebnisse zurückgeben. Nachverfolgen, welche Funktionen erwarten, die als Eingaben eingeben und welche Typen als Ausgaben zurückgeben, und dann immer wieder hin und her konvertieren, ist unglaublich umständlich und unmöglich, in jedem Maßstab richtig zu kommen.

Es wird sehr verlockend sein, wenn wir ndarray haften und deprecate Matrix und Unterstützung ndarray mit Matrixoperationsmethoden wie .inverse(), .hermitian(), Dyadisches Produkt(), usw., in der Zukunft.

Der Hauptgrund, warum ich noch Matrix Klasse verwenden muss ist, dass es 1D-Array als 2D-Array behandelt, damit ich es transponieren kann.

Es ist sehr unbequem so weit, wie ich 1d Array transponiere, da 1d Array der Größe n Form (n,) statt (1, n) hat. Wenn beispielsweise I das innere Produkt von zwei Arrays zu tun haben:

A = [[1,1,1],[2,2,2].[3,3,3]] 

B = [[1,2,3],[1,2,3],[1,2,3]] 

np.dot (A, B) funktioniert gut, aber wenn

B = [1,1,1] 

, ihre Transponierte ist noch ein Zeilenvektor .

Ich muss diese Ausnahme behandeln, wenn die Dimensionen der Eingabevariablen unbekannt ist.

Ich hoffe, dass dies einige Menschen mit den gleichen Schwierigkeiten helfen, und hoffe zu wissen, ob es eine bessere Möglichkeit gibt, Matrix-Betrieb wie in Matlab, vor allem mit 1d-Array zu behandeln. Vielen Dank.

Antwort

2

Ihr erstes Beispiel ist ein Spaltenvektor:

In [258]: x = np.arange(3).reshape(3,1) 
In [259]: x 
Out[259]: 
array([[0], 
     [1], 
     [2]]) 
In [260]: xm = np.matrix(x) 

dot erzeugt das Skalarprodukt und Dimensionen arbeiten als: (1,2), (2,1) => (1,1)

In [261]: np.dot(x.T, x) 
Out[261]: array([[5]]) 

das Matrixprodukt macht das gleiche:

In [262]: xm.T * xm 
Out[262]: matrix([[5]]) 

(dasselbe mit 1D-Arrays erzeugt einen Skalarwert, np.dot([0,1,2],[0,1,2]) # 5)

Element Multiplikation der Arrays das äußere Produkt erzeugt (tut so np.outer(x, x) und np.dot(x,x.T))

In [263]: x.T * x 
Out[263]: 
array([[0, 0, 0], 
     [0, 1, 2], 
     [0, 2, 4]]) 

Für ndarray IST * Element weise Multiplikation (die .* von MATLAB, aber mit Rundfunk hinzugefügt). Für die Elementmultiplikation matrixnp.multiply(xm,xm) verwenden. (scipy spärlich Matrizen haben eine Multiplikationsmethode, X.multiply(other))

Sie zitieren von der PEP, die @ Operator hinzugefügt (matmul). Dies, sowie np.tensordot und np.einsum können größere dimensionale Arrays und andere Produktmischungen verarbeiten. Diese sind mit np.matrix nicht sinnvoll, da das auf 2d beschränkt ist.

Mit Ihrem 3x3 A und B

In [273]: np.dot(A,B) 
Out[273]: 
array([[ 3, 6, 9], 
     [ 6, 12, 18], 
     [ 9, 18, 27]]) 
In [274]: C=np.array([1,1,1]) 
In [281]: np.dot(A,np.array([1,1,1])) 
Out[281]: array([3, 6, 9]) 

Effektiv fasst diese jede Zeile. np.dot(A,np.array([1,1,1])[:,None]) macht das Gleiche, gibt aber ein (3,1) Array zurück.

np.matrix wurde vor Jahren erstellt, um numpy (eigentlich einer seiner Vorgänger) fühlen sich mehr wie MATLAB. Ein Hauptmerkmal ist, dass es auf 2d beschränkt ist. So war MATLAB in den 90er Jahren. np.matrix und MATLAB haben keine 1d-Arrays; stattdessen haben sie einspaltige oder einreihige Matrizen.

Wenn die Tatsache, dass ndarrays 1d (oder sogar 0d) sein kann, ein Problem gibt, gibt es viele Möglichkeiten, diese zweite Dimension hinzuzufügen. Ich bevorzuge die [None,:] Art der Syntax, aber reshape ist auch nützlich. ndmin=2, np.atleast_2d, auch arbeiten.

np.sum und andere Operationen, die Abmessungen reduziert haben einen keepdims=True Parameter, um dem zu begegnen. Das neue @ gibt eine Operator-Syntax für die Matrixmultiplikation. Soweit ich weiß, np.matrix Klasse hat keinen eigenen kompilierten Code.

============

Die Methode, die * für np.matrix implementiert np.dot verwendet:

def __mul__(self, other): 
    if isinstance(other, (N.ndarray, list, tuple)) : 
     # This promotes 1-D vectors to row vectors 
     return N.dot(self, asmatrix(other)) 
    if isscalar(other) or not hasattr(other, '__rmul__') : 
     return N.dot(self, other) 
    return NotImplemented 
+0

Danke, das ist sehr hilfreich. Ich denke, wir können sagen, Matrix-Klasse sollte veraltet sein, da ndarray vielseitiger zu sein scheint? – Vespa

Verwandte Themen