Wie lese ich CSV-Daten in einem Datensatz-Array in NumPy?
-
29-09-2019 - |
Frage
Ich frage mich, ob es ein direkter Weg, um den Inhalt einer CSV-Datei in einen Rekord-Array, viel in die Weise, dass R read.table()
, read.delim()
und read.csv()
Familie importiert Daten in R-Datenrahmen zu importieren?
Oder ist der beste Weg, verwenden csv.reader () und dann so etwas wie numpy.core.records.fromrecords()
anwenden?
Lösung
Sie können Numpy der genfromtxt()
Methode verwenden, so zu tun, durch den delimiter
kwarg auf ein Komma zu setzen.
from numpy import genfromtxt
my_data = genfromtxt('my_file.csv', delimiter=',')
Weitere Informationen über die Funktion an seiner jeweiligen Dokumentation zu finden .
Andere Tipps
würde ich empfehlen, die read_csv
Funktion aus der Bibliothek pandas
:
import pandas as pd
df=pd.read_csv('myfile.csv', sep=',',header=None)
df.values
array([[ 1. , 2. , 3. ],
[ 4. , 5.5, 6. ]])
Dies ergibt eine Pandas Datenrahmen - so dass Funktionen viele nützliche Datenmanipulation, die mit numpy Datensatz-Arrays nicht direkt verfügbar sind .
Datenrahmen ist eine 2-dimensionale markierte Datenstruktur mit Spalten potenziell verschiedene Typen. Sie können wie eine Tabelle darüber denken oder SQL-Tabelle ...
Ich würde auch genfromtxt
empfehlen. Da sich jedoch die Frage nach einem Datensatz Array , im Gegensatz zu einem normalen Array, muss der dtype=None
Parameter den genfromtxt
Aufruf hinzugefügt werden:
Da eine Eingabedatei, myfile.csv
:
1.0, 2, 3
4, 5.5, 6
import numpy as np
np.genfromtxt('myfile.csv',delimiter=',')
gibt einen Array:
array([[ 1. , 2. , 3. ],
[ 4. , 5.5, 6. ]])
und
np.genfromtxt('myfile.csv',delimiter=',',dtype=None)
gibt einen Rekord-Array:
array([(1.0, 2.0, 3), (4.0, 5.5, 6)],
dtype=[('f0', '<f8'), ('f1', '<f8'), ('f2', '<i4')])
Dies hat den Vorteil, dass Datei mit mehr Datentypen (einschließlich Strings) leicht importiert werden.
Sie können auch recfromcsv()
versuchen, die Datentypen erraten kann und geben einen richtig Satzarray formatiert.
I timed die
from numpy import genfromtxt
genfromtxt(fname = dest_file, dtype = (<whatever options>))
Vergleich
import csv
import numpy as np
with open(dest_file,'r') as dest_f:
data_iter = csv.reader(dest_f,
delimiter = delimiter,
quotechar = '"')
data = [data for data in data_iter]
data_array = np.asarray(data, dtype = <whatever options>)
auf 4,6 Millionen Zeilen mit etwa 70 Spalten und festgestellt, dass der NumPy Weg dauerte 2 min 16 sec und die CSV-Liste Verständnis Verfahren dauerten 13 Sekunden.
würde ich die csv-Liste Verständnis Methode empfehlen, da es höchstwahrscheinlich auf vorkompilierte Bibliotheken angewiesen ist und nicht den Interpreter so viel wie NumPy. Ich vermute, dass die Pandas ähnlichen Verfahren wie Dolmetscher Kopf hat.
versucht Wie ich in beiden Richtungen mit NumPy und Pandas, mit Pandas viele Vorteile hat:
- Schneller
- Weniger CPU-Auslastung
- 1/3 RAM-Auslastung zu NumPy Vergleich genfromtxt
Das ist mein Testcode:
$ for f in test_pandas.py test_numpy_csv.py ; do /usr/bin/time python $f; done
2.94user 0.41system 0:03.05elapsed 109%CPU (0avgtext+0avgdata 502068maxresident)k
0inputs+24outputs (0major+107147minor)pagefaults 0swaps
23.29user 0.72system 0:23.72elapsed 101%CPU (0avgtext+0avgdata 1680888maxresident)k
0inputs+0outputs (0major+416145minor)pagefaults 0swaps
test_numpy_csv.py
from numpy import genfromtxt
train = genfromtxt('/home/hvn/me/notebook/train.csv', delimiter=',')
test_pandas.py
from pandas import read_csv
df = read_csv('/home/hvn/me/notebook/train.csv')
Datendatei:
du -h ~/me/notebook/train.csv
59M /home/hvn/me/notebook/train.csv
Mit NumPy und Pandas am Version:
$ pip freeze | egrep -i 'pandas|numpy'
numpy==1.13.3
pandas==0.20.2
Sie können diesen Code verwenden CSV-Datei Daten in ein Array zu senden:
import numpy as np
csv = np.genfromtxt('test.csv', delimiter=",")
print(csv)
Ich habe versucht, diese:
import pandas as p
import numpy as n
closingValue = p.read_csv("<FILENAME>", usecols=[4], dtype=float)
print(closingValue)
Mit numpy.loadtxt
Eine ganz einfache Methode. Aber es erfordert, dass alle die Elemente sind Schwimmer (int usw.)
import numpy as np
data = np.loadtxt('c:\\1.csv',delimiter=',',skiprows=0)
Dies ist die einfachste Art und Weise:
import csv
with open('testfile.csv', newline='') as csvfile:
data = list(csv.reader(csvfile))
Jetzt jeder Eintrag in den Daten ist ein Datensatz, als Array dargestellt. So haben Sie eine Array 2D. Es ersparte mir so viel Zeit.
Ich würde vorschlagen, Tabellen (pip3 install tables
) verwenden. Sie können Ihre .csv
Datei .h5
mit Pandas (pip3 install pandas
)
import pandas as pd
data = pd.read_csv("dataset.csv")
store = pd.HDFStore('dataset.h5')
store['mydata'] = data
store.close()
Sie können dann leicht und mit weniger Zeit, auch für große Datenmengen laden Sie Ihre Daten in einem NumPy array .
import pandas as pd
store = pd.HDFStore('dataset.h5')
data = store['mydata']
store.close()
# Data in NumPy format
data = data.values
Diese Arbeit als Charme ...
import csv
with open("data.csv", 'r') as f:
data = list(csv.reader(f, delimiter=";"))
import numpy as np
data = np.array(data, dtype=np.float)