Jupyter Notebook

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Fabian2712
User
Beiträge: 6
Registriert: Freitag 6. September 2019, 14:03

Ich habe eine frage zu Jupyter Notebook (bin absoluter Neuling und habe kaum Programmierfahrung). Um ein neuronales Netz mit hilfe eines Quelltextes aus einem Buch zu erstellen ist ein Abschnitt:

for index, row in df.iterrows():
fname = "{:.0f}.jpg".format(row['id'])

classname = row['genus']
if row ['id']<3000:
dest_dir = os.path.join(dir_dict['train'+classname])
elif row ['id']<3500:
dest_dir = os.path.join(dir_dict['test'+classname])
else:
dest_dir = os.path.join(dir_dict['valid'+classname])

src = os.path.join(dir_dict['download'],fname)
dest = os.path.join(dest_dir,fname)
shutil.copyfile(src, dest)

Dabei kommt der Fehler: TypeError: can only concatenate str (not "numpy.float64") to str

Es befinden sich 4000 Bilder im Downloadordner einer angelegten Verzeichnisstruktur und sollen je nach Klasse in die drei anderen Ordner die auf der selben Ebene dieser Verzeichnisstruktur liegen gebracht werden. Bin für jede Hilfe dankbar =)
Benutzeravatar
__blackjack__
User
Beiträge: 13100
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Fabian2712: Bitte zeige Quelltext in einem Code-Block, damit man die Einrückung sehen kann – die ist in Python wichtig. Und dann bitte den kompletten Traceback, damit wir hier nicht raten müssen *wo* der Fehler auftritt.

`os.path.join()` mit nur *einem* Argument aufzurufen ist unsinnig, weil das nicht wirklich etwas bewirkt.

Ist ``row["id"]`` tatsächlich eine Gleitkommazahl und keine ganze Zahl? Also nicht nur vom Wert, sondern auch vom Datentyp her?

Kürze keine Namen ab und Grunddatentypen haben in Namen auch nichts verloren. Das `dir_dict` sieht aber sowieso etwas komisch aus. Was ist der Grund gewesen die Verzeichnisnamen in ein Wörterbuch zu stecken, statt da einfach Konstanten für zu definieren?

Hier mal überarbeitet und wahrscheinlich mit einer falschen Einrückung, denn das kopieren soll doch sicherlich *in* der Schleife passieren‽

Code: Alles auswählen

    for _index, row in df.iterrows():
        classname = row["genus"]
        if row["id"] < 3000:
            destination_path = name_to_path["train" + classname]
        elif row["id"] < 3500:
            destination_path = name_to_path["test" + classname]
        else:
            destination_path = name_to_path["valid" + classname]

    filename = "{:.0f}.jpg".format(row["id"])
    shutil.copyfile(
        os.path.join(name_to_path["download"], filename),
        os.path.join(destination_path, filename),
    )
Man sollte überlegen `pathlib.Path` für Pfade/Dateinamen zu verwenden und nicht Zeichenketten und `os.path`-Funktionen.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

Oh man, typisches Beispiel für verkorkstes Denken bei manchen Programmierern.
Warum tausende Dateien physikalisch auf einem Datenträger in Verzeichnisse verteilen, wenn es reichen würde, das in memory nur mit den Dateinamen zu machen.
Ich hatte mal einen Kurs von Udacity, die hatten einen MNIST ähnlichen Datensatz mit über 500k train Bildern in 10 Klassen, verteilt auf 10 Ordner a je 50k in einem train Ordner
und dann nochmal 20k test Bilder verteilt auf 10 Ordner in einem test Ordner. Der ganze Dateigewurschtelcode war der Horror, ähnlich wie oben.
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