Umformen ein array von Bildern
Habe ich 60000 train_images brachte als eine Form (28,28,60000) - matrix. Es ist ein numpy.ndarray. Ich möchte konvertieren es in ein array von 1-dimensionale Bilder, d.h. jedes Bild wird dargestellt als eine einzelne Leitung/array von zahlen, und ich möchte, 60000-arrays. In anderen Worten, ich will von (28, 28, 60000) zu (60000, 28*28). In python wäre es:
images_features = []
for image in images:
imageLine = []
for y in range(len(image)):
for x in range(len(image[0])):
imageLine.append(image[y][x])
images_features.append(imageLine)
Wie kann ich dies tun? Ich vermute, dass ich Umformen, aber ich konnte nicht herausfinden, wie genau ich dies tun kann.
Dies ist, wie ich immer bin-Bilder:
data = scipy.io.loadmat('train.mat')
images = data["train_images"]
Also die "Bilder" ist die Reihe, die ich spreche.
Jemand mir vorgeschlagen, dass:
"Möglicherweise müssen Sie zum ändern von Achsen, oder kombinieren Sie Sie bekommen die Funktionen, die Sie wollen. Ich empfehle Ihnen aufträgt als auch im Falle eines Bildes landet seitlich. Stellen Sie sicher, dass Sie eifrig sind, mit Ihren Achsen um zukünftige Probleme zu vermeiden es."
Ich habe keine Ahnung, was "Achsen" bezeichnet wird, um hier und wie nehmen Sie, was oben gesagt Berücksichtigung.
Kann mir jemand erklären was ich tun muss und warum? (Was es tut)
- Vielleicht
images.reshape(-1).tolist()
wenn Sie möchten, dass die Ausgabe in eine python Liste (oder ohnetolist()
sonst)? - Was bedeutet die -1 zu tun? Ich brauche eine 1 von 28^2 von 60000 array.
- Naja sorry ich misreaded. die
-1
flatten vollständig die matrix (das ist nicht das, was Sie wollen). Sie können werfen Sie einen Blick auf die numpy-Dokumentation über dieN-dimensional array
- Wenn ich gut verstehe, Sie
images.reshape(-1, 60000)
wird die Arbeit machen ? Geben Sie 60000 verfügt mit 784 Werte. Um die Ausgabe als python-Liste von 60000 features :images.reshape(-1, 60000).T.tolist()
image.transpose(2,0,1)
oderimage.transpose(2,1,0)
?- Du meinst NACH dem Umformen? Warum sollte das hier nötig sein? @Divakar
- Ich meine, um zu gehen von
(28, 28, 60000)
zu(60000, 28*28)
einer von den beiden sollte funktionieren. Und KEINE Umgestaltung notwendig. - Der Form nach entweder von den beiden transponiert ist noch (60000, 28, 28) , nicht (60000, 28*28), wobei für jedes Bild eine Zeile verkettet ist, an das Ende der vorherigen Zeile, wodurch eine Zeile pro Bild, 60000 Zeilen insgesamt. @Divakar
- Also, versuchen Sie
image.transpose(2,0,1).reshape(60000,-1)
undimage.transpose(2,1,0).reshape(60000,-1)
. Einer der beiden sollte funktionieren. - Danke, Bild.transpose(2,1,0).reshape(60000,-1) funktioniert! @Divakar
- Alternativ, nur Bild.transpose().reshape(60000, -1), mit den Standard umsetzen.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Da kommt, über
loadmat
eine Form(28,28,60000)
Sinn macht - MATLAB iteriert beginnend mit dem letzten index.verschiebt die Achsen, also das Ergebnis ist
(60000,28,28)
. Die letzten beiden Dimensionen können kombiniert mit einer NeugestaltungIhnen viele müssen zur Umsetzung der 28x28 Bilder, z.B.
.T
ist die gleiche wie die MATLAB -'
(oder.'
).images
kann auchorder='F'
.Wählte ich test Abmessungen klein zu sein, und machen es einfach, zu unterscheiden, die verschiedenen Achsen.
In einem Ipython-Sitzung:
Ich denke, Sie brauchen nur zu verwenden Umformen:
28, 28, 60000
nur um die Zahl, die Sie gesagt in Ihrer Frage, aberreshape
nicht beschwert, als die Größe des Arrays nicht geändert werden (und die Ausgabe wird wohl mehr bestellt, wie Sie wollen mit60000, 28*28
statt28*28, 60000
).Können Sie Umformen
train_images
und überprüfen Sie es anhand der Darstellung der Bilder,Umformen:
Plotten Bilder: