Seite 1 von 1

Jupyter Notebook

Verfasst: Dienstag 10. September 2019, 23:53
von Fabian2712
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 =)

Re: Jupyter Notebook

Verfasst: Mittwoch 11. September 2019, 00:20
von __blackjack__
@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.

Re: Jupyter Notebook

Verfasst: Mittwoch 11. September 2019, 06:17
von ThomasL
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.