Numpy array in einem for-loop befüllen

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

Hi,

eigentlich dachte ich, dass es ganz einfach sein werde. Möchte jedes Bild standardisieren indem ich einfach durch iteriere und mir jeden 2D Array, also 28x28 scale.

Code: Alles auswählen

import numpy as np
from sklearn import preprocessing

data = data.reshape(-1, 1, 28, 28)
 
for i in range(len(data)):
       scaler = preprocessing.StandardScaler().fit(data[i,0])
       data_stdized[i,0] = scaler.transform(data[i,0])

return data_stdized                       
Bekomme aber den Error:

Code: Alles auswählen

    data_stdized[i,0] = scaler.transform(data[i,0])
NameError: name 'data_stdized' is not defined
Woran liegt es?
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@naheliegend: Das liegt daran das `data_stdized` nicht definiert ist. Was soll das denn sein und wo denkst Du das das auf magische Weise her kommt?
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

Es gibt Programmiersprachen, da wird der Speicher für ein neuen Array direkt mitallokiert bzw die Variable initialisiert, oder? Denke da an Matlab gerade.

Was ist denn nun der schnellste und einfachste Weg Matrizen in einem array zu speichern?

also data_stdized hat eine shape von (60000,1,28,28), wobei die 60000 variable ist.
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
einfachTobi
User
Beiträge: 491
Registriert: Mittwoch 13. November 2019, 08:38

Iteriere nicht über ein Array. Das ist fast immer der falsche Ansatz. Zur Entstehung der Fehlermeldung hat __blackjack__ ja schon was gesagt. Hier kannst du auch fit_transform() verwenden, um die Schritte gleichzeitig durchzuführen - im gesamtem Array.
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@naheliegend: Python als Sprache hat keine Arrays. Woher sollte Python denn wissen welchen Datentyp `data_stdized` überhaupt haben soll wenn man das nicht explizit irgendwo sagt?

Und selbst wenn es nur Arrays gäbe, woher sollte eine Programmiersprache bei der Zuweisung wissen welche Dimensionen das automagisch nur durch eine Zuweisung erzeugte Array haben soll? Geht das tatsächlich so in Matlab? Dann müssen die Arrays dort aber dynamisch bei Zuweisungen die Grösse ändern können. Was Numpy-Arrays nicht tun.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

Danke für eure schnellen Antworten. Das freut mich und hat mich noch stärker zum googeln angeregt. All in all bin ich aber keinen Schritt weiter. :D

data hat ja die shape (X,1,28,28). Jetzt möchte ich aber jedes Bild, welches die Größe 28x28 hat, standardisieren.

fit_transform(self, X[, y]) erwartet offensichtlich eine 2D Matrix. Da komme ich wohl um eine Iteration nicht herum oder?
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
naheliegend
User
Beiträge: 439
Registriert: Mittwoch 8. August 2018, 16:42

Kann es sein, dass es nicht so clever ist Bilder in der Form (X,1,28,28) zu speichern bzgl preprocessing?

datasets.load_digits() z.b. speichert alle Bildmatrizen nebeneinander und untereinander in einer großen 2D Matrix. Ist das nicht clever, weil die Bildgröße kennt man ja und kann sie dementsprechend am Ende zum trainieren eines CNNs wieder auseinanderdröseln.
__backjack__: "Jemand der VB oder PHP kann, der also was Programmieren angeht irgendwo im negativen Bereich liegt (...)"
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Die Bilddaten des MNIST oder Fashion-MNIST Datensatzes haben den Wertebereich 0...255, um die Bilder in ein CNN einzuspeisen reicht
eine einfache Division durch 255 für eine Normalisierung des gesamten Datensatzes aus, wenn die Daten als numpy ndarray vorliegen.

Code: Alles auswählen

data = data / 255.0
Dadurch hast du auch gleichzeitig eine Konvertierung des Datentyps von uint8 nach float.
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Antworten