Ich benutze Numpy. Ich habe eine Matrix mit 1 Spalte und N Zeilen und möchte ein Array mit N Elementen erhalten.
Wenn ich zum Beispiel M = matrix([[1], [2], [3], [4]])
habe, möchte ich A = array([1,2,3,4])
bekommen.
Um dies zu erreichen, benutze ich A = np.array(M.T)[0]
. Weiß jemand einen eleganteren Weg, um das gleiche Ergebnis zu erzielen?
Vielen Dank!
Wenn Sie etwas Lesbareres möchten, können Sie Folgendes tun:
A = np.squeeze(np.asarray(M))
Äquivalent können Sie auch Folgendes tun: A = np.asarray(M).reshape(-1)
, aber das ist etwas weniger lesbar.
result = M.A1
https://docs.scipy.org/doc/numpy-1.14.0/reference/generated/numpy.matrix.A1.html
matrix.A1
1-d base array
A, = np.array(M.T)
es hängt davon ab, was Sie mit Eleganz meinen, aber ich würde es gerne tun
Sie können folgende Variante ausprobieren:
result=np.array(M).flatten()
np.array(M).ravel()
Wenn du auf Geschwindigkeit achtest; Aber wenn Sie sich für das Gedächtnis interessieren:
np.asarray(M).ravel()
Oder Sie könnten versuchen, einige Tempos mit zu vermeiden
A = M.view(np.ndarray)
A.shape = -1
Erstens, Mv = numpy.asarray(M.T)
, gibt Ihnen ein 4x1-, aber ein 2D-Array.
Führen Sie dann A = Mv[0,:]
aus, der Ihnen das gibt, was Sie möchten. Sie könnten sie als numpy.asarray(M.T)[0,:]
zusammenstellen.
Dadurch wird die Matrix in ein Array umgewandelt
A = np.ravel(M).T
ravel () und flatten () Funktionen von numpy sind zwei Techniken, die ich hier ausprobieren möchte. Ich möchte gerne die Beiträge von Joe , Siraj , Bubble und Kevad hinzufügen.
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 anfertigt. Jede Änderung in Array A wird jedoch auf das ursprüngliche Array M übertragen, wenn Sie numpy.ravel()
verwenden}.
numpy.flatten()
IST LANGSAMER ALS numpy.ravel()
. Wenn Sie jedoch numpy.flatten()
zum Erstellen von A verwenden, werden Änderungen in A werden nicht in das ursprüngliche Array M übernommen.
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