Numpy Matrix zu Array


149

Ich benutze Numpy. Ich habe eine Matrix mit 1 Spalte und N Zeilen und möchte ein Array mit N Elementen erhalten.

Zum Beispiel, wenn ich habe M = matrix([[1], [2], [3], [4]]), möchte ich bekommen A = array([1,2,3,4]).

Um es zu erreichen, benutze ich A = np.array(M.T)[0]. Kennt jemand einen eleganteren Weg, um das gleiche Ergebnis zu erzielen?

Vielen Dank!


Antworten:


192

Wenn Sie etwas besser lesbares möchten, können Sie dies tun:

A = np.squeeze(np.asarray(M))

Gleichermaßen könnten Sie auch: tun A = np.asarray(M).reshape(-1), aber das ist etwas weniger leicht zu lesen.


9
Wenig Schimpfen meinerseits ... warum hat Numpy Arrays und Matrizen als separate Einheiten. Es ist meiner Meinung nach so unpythonisch. Danke für diesen Tipp @Joe.
Naijaba

6
@Naijaba - Für das, was es wert ist, wird die Matrixklasse effektiv (aber nicht formal) abgeschrieben. Es ist hauptsächlich für historische Zwecke da. Das Entfernen numpy.matrixist ein umstrittenes Thema, aber die numpy-Entwickler stimmen Ihnen sehr zu, dass es aus einer ganzen Reihe von Gründen unpythonisch und ärgerlich ist, beides zu haben. Die Menge an altem, nicht gepflegtem Code "in the wild", der verwendet wird, matrixmacht es jedoch schwierig, ihn vollständig zu entfernen.
Joe Kington

1
Ganz zu schweigen davon, dass die echte Matrixmultiplikation nur für Arrays in Numpy 1.10 hinzugefügt wurde und sich im Grunde noch in der Beta befindet. Dies bedeutet, dass viele Leute (einschließlich ich) immer noch Matrizen anstelle von Arrays verwenden müssen, um das zu erledigen, was wir wollen. docs.scipy.org/doc/numpy/reference/generated/numpy.matmul.html
Georges Oates Larsen

1
Spärliche Matrizen sind für ein speichereffizientes maschinelles Lernen von grundlegender Bedeutung (z sklearn. B. ). Tatsächlich gibt es verschiedene sparse matrixTypen scipy, die einen effizienten Zugriff über Zeilen oder Spalten ermöglichen. Ich stelle mir vor, dass dies ein Problem beim Zusammenführen der Konzepte von Matrix und Array sein könnte. Trotzdem frage ich mich, ob es auch einen sparse arrayTyp geben könnte und ob es Pläne dafür gibt. Irgendwelche Hinweise?
PMS

Ich denke, .flatten () funktioniert genauso gut wie .squeeze (), solange Sie am Ende ein 1D-Array wollen.
Worte für den

122

6
Ich denke, diese Antwort ist besser als die akzeptierte Antwort, was die Leistung und die Einfachheit
betrifft

M.A1 ist großartig, dieselbe Implementierung wie "ravel" und "flatten" und verursacht in diesem Fall keine Datenkopie. A bleibt daher mit M verbunden, was zu Überraschungen führen kann, wenn A und / oder M veränderlich sind. M.flat echte Alternative, die den "Flatiter" -Generator zurückgibt (schreibgeschützte Semantik) M, -1) # ist normalerweise eine Ansicht, die von der Formkompatibilität
abhängt.

13
A, = np.array(M.T)

hängt davon ab, was du mit Eleganz meinst, aber das würde ich tun


11

Sie können die folgende Variante ausprobieren:

result=np.array(M).flatten()

7
np.array(M).ravel()

Wenn Sie Wert auf Geschwindigkeit legen; Aber wenn Sie sich für das Gedächtnis interessieren:

np.asarray(M).ravel()

Es würde die Qualität Ihrer Antwort verbessern, wenn Sie erklären würden, warum
Milo Wielondek

6

Oder Sie könnten versuchen, einige Zeit mit zu vermeiden

A = M.view(np.ndarray)
A.shape = -1

2

Erstens, Mv = numpy.asarray(M.T)was Ihnen ein 4x1 aber 2D-Array gibt.

Dann führen A = Mv[0,:], was gibt Ihnen , was Sie wollen. Sie könnten sie zusammensetzen, als numpy.asarray(M.T)[0,:].


2

Dadurch wird die Matrix in ein Array konvertiert

A = np.ravel(M).T

0

Die Funktionen ravel () und flatten () von numpy sind zwei Techniken, die ich hier ausprobieren würde. Ich möchte die Beiträge von Joe , Siraj , Bubble und Kevad ergänzen .

Ravel:

A = M.ravel()
print A, A.shape
>>> [1 2 3 4] (4,)

Ebnen:

M = np.array([[1], [2], [3], [4]])
A = M.flatten()
print A, A.shape
>>> [1 2 3 4] (4,)

numpy.ravel()ist schneller , da es sich um eine Funktion auf Bibliotheksebene handelt, die keine Kopie des Arrays erstellt. Jedoch wird jede Änderung in Array A sich auf die ursprüngliche Anordnung M tragen über , wenn Sie verwendennumpy.ravel() .

numpy.flatten()ist langsamer alsnumpy.ravel() . Wenn Sie jedoch numpy.flatten()A erstellen, werden Änderungen in A nicht auf das ursprüngliche Array M übertragen .

numpy.squeeze()und M.reshape(-1)sind langsamer als numpy.flatten()und numpy.ravel().

%timeit M.ravel()
>>> 1000000 loops, best of 3: 309 ns per loop

%timeit M.flatten()
>>> 1000000 loops, best of 3: 650 ns per loop

%timeit M.reshape(-1)
>>> 1000000 loops, best of 3: 755 ns per loop

%timeit np.squeeze(M)
>>> 1000000 loops, best of 3: 886 ns per loop
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.