Seite 1 von 1

csv-datei in numpy-array mit unterschiedlichen datentypen pro spalte

Verfasst: Samstag 29. Februar 2020, 22:26
von kussji
Hallo
Ich packe eine CSV-Datei in ein numpy-array.

Der folgende Code macht dabei alles float.
Gibt es die Möglichkeit die ersten beiden csv-Werte als int32 und der letzte Wert float32? :roll:

data.csv
256945 1365856 1595.23
267894 1348952 1689.14

Code: Alles auswählen

with open(data.csv,'r') as dest_f:
    data_iter = csv.reader(dest_f, delimiter = ' ')
    data = [data for data in data_iter]

dt = np.dtype(np.float32)
data_array = np.asarray(data, dtype = dt)

Re: csv-datei in numpy-array mit unterschiedlichen datentypen pro spalte

Verfasst: Samstag 29. Februar 2020, 22:48
von __blackjack__
@kussji: Warum benutzt Du nicht `numpy` zum Einlesen der CSV-Datei? Da suchst Du `recfromtxt()`.

Die „list comprehension“ macht ja nicht wirklich etwas, das wäre einfacher ``data = list(data_iter)`` oder ohne den Namen für das Zwischenergebnis: ``data = list(csv.reader(dest_f, delimiter=" "))``.

Was ist denn der Gedanke hinter dem Namen `dest_f`? Das scheint mir falsch zu sein.

Re: csv-datei in numpy-array mit unterschiedlichen datentypen pro spalte

Verfasst: Sonntag 1. März 2020, 17:45
von kussji
Hallo Danke für die Antwort.

Funktion kannte ich nicht - Danke. Wenn ich ehrlich bin, obiger Code ist aus dem Netz kopiert. Name "dest_f" hat mich auch etwas verwundert.

Also probiere ich es so:

Code: Alles auswählen

data = np.genfromtxt(fileName, dtype=[('s1','i4'),('s2','i4'),('s3','f4')], delimiter=" ")
Wäre zwar das was ich suche - nur: Meine Datei die ich einlese hat über 10Mio. Zeilen.mit der Funktion "genfromtxt()" dauert das einlesen ca. 4 Minuten.
Mit meinem erst geposteten Code dauert es nur etwa 30 Sekunden - aber eben, nicht das richtige Format. Darum bin ich noch nicht glücklich :roll:

Jemand eine gute Idee?

Re: csv-datei in numpy-array mit unterschiedlichen datentypen pro spalte

Verfasst: Sonntag 1. März 2020, 18:05
von Sirius3
Dann lies halt erst alles als floats und wandle das danach um.