Laden Sie csv in eine 2D-Matrix mit numpy zum Zeichnen

78

Angesichts dieser CSV-Datei:

"A","B","C","D","E","F","timestamp"
611.88243,9089.5601,5133.0,864.07514,1715.37476,765.22777,1.291111964948E12
611.88243,9089.5601,5133.0,864.07514,1715.37476,765.22777,1.291113113366E12
611.88243,9089.5601,5133.0,864.07514,1715.37476,765.22777,1.291120650486E12

Ich möchte es einfach als Matrix / ndarray mit 3 Zeilen und 7 Spalten laden. Aus irgendeinem Grund ist alles, was ich aus numpy herausholen kann, ein ndarray mit 3 Zeilen (eine pro Zeile) und ohne Spalten.

r = np.genfromtxt(fname,delimiter=',',dtype=None, names=True)
print r
print r.shape

[ (611.88243, 9089.5601000000006, 5133.0, 864.07514000000003, 1715.3747599999999, 765.22776999999996, 1291111964948.0)
 (611.88243, 9089.5601000000006, 5133.0, 864.07514000000003, 1715.3747599999999, 765.22776999999996, 1291113113366.0)
 (611.88243, 9089.5601000000006, 5133.0, 864.07514000000003, 1715.3747599999999, 765.22776999999996, 1291120650486.0)]
(3,)

Ich kann es manuell iterieren und in die gewünschte Form hacken, aber das scheint albern. Ich möchte es nur als richtige Matrix laden, damit ich es über verschiedene Dimensionen schneiden und zeichnen kann, genau wie in Matlab.

dgorissen
quelle

Antworten:

152

Pure Numpy

numpy.loadtxt(open("test.csv", "rb"), delimiter=",", skiprows=1)

Lesen Sie die Loadtxt- Dokumentation.

Sie können auch das CSV-Modul von Python verwenden:

import csv
import numpy
reader = csv.reader(open("test.csv", "rb"), delimiter=",")
x = list(reader)
result = numpy.array(x).astype("float")

Sie müssen es in Ihren bevorzugten numerischen Typ konvertieren. Ich denke, Sie können das Ganze in einer Zeile schreiben:

result = numpy.array (list (csv.reader (open ("test.csv", "rb"), delimiter = ","))). astype ("float")

Hinweis hinzugefügt:

Sie können auch pandas.io.parsers.read_csvdas zugehörige numpyArray verwenden und abrufen, das schneller sein kann.

Kaveh_kh
quelle
Ich würde hinzufügen, dass das Flag skiprows = 1 die erste Zeile überspringt und kein Standardaktivierungsflag ist, wenn Sie alle Daten behalten möchten. Hat perfekt funktioniert!
Arturo
loadtxt lädt nicht auch die Spaltennamen, die mit names = True auf genfromtxt
mhstnsc
Kann ich fragen - ist openlokal für diese einzelne Zeile? Wird die Datei wie in am Ende der Zeile geschlossen?
Daniel Soutar
Ja, die Datei wird geschlossen. Siehe auch: stackoverflow.com/questions/8011797/…
Kaveh_kh
Ich würde vorschlagen, die seocnd-Methode zu verwenden, da sie furchtbar loadtxtlangsam ist. Alternativ pandasist ziemlich gut für den Zweck
Feuerball.1
6

Ich denke, die Verwendung dtypeeiner Namenszeile verwirrt die Routine. Versuchen

>>> r = np.genfromtxt(fname, delimiter=',', names=True)
>>> r
array([[  6.11882430e+02,   9.08956010e+03,   5.13300000e+03,
          8.64075140e+02,   1.71537476e+03,   7.65227770e+02,
          1.29111196e+12],
       [  6.11882430e+02,   9.08956010e+03,   5.13300000e+03,
          8.64075140e+02,   1.71537476e+03,   7.65227770e+02,
          1.29111311e+12],
       [  6.11882430e+02,   9.08956010e+03,   5.13300000e+03,
          8.64075140e+02,   1.71537476e+03,   7.65227770e+02,
          1.29112065e+12]])
>>> r[:,0]    # Slice 0'th column
array([ 611.88243,  611.88243,  611.88243])
mtrw
quelle
Interessanterweise ändert dies in meinem Fall nichts am Ergebnis. Ich benutze Python 2.5 und numpy 1.4.1, also ist das vielleicht das Problem
dgorissen
Ich benutze Python 2.6 und NumPy 1.3.0! Ich mag das ältere Verhalten besser.
mtrw
4

Sie können eine CSV-Datei mit Headern in ein strukturiertes NumPy-Array mit np.genfromtxt einlesen . Zum Beispiel:

import numpy as np

csv_fname = 'file.csv'
with open(csv_fname, 'w') as fp:
    fp.write("""\
"A","B","C","D","E","F","timestamp"
611.88243,9089.5601,5133.0,864.07514,1715.37476,765.22777,1.291111964948E12
611.88243,9089.5601,5133.0,864.07514,1715.37476,765.22777,1.291113113366E12
611.88243,9089.5601,5133.0,864.07514,1715.37476,765.22777,1.291120650486E12
""")

# Read the CSV file into a Numpy record array
r = np.genfromtxt(csv_fname, delimiter=',', names=True, case_sensitive=True)
print(repr(r))

das sieht so aus:

array([(611.88243, 9089.5601, 5133., 864.07514, 1715.37476, 765.22777, 1.29111196e+12),
       (611.88243, 9089.5601, 5133., 864.07514, 1715.37476, 765.22777, 1.29111311e+12),
       (611.88243, 9089.5601, 5133., 864.07514, 1715.37476, 765.22777, 1.29112065e+12)],
      dtype=[('A', '<f8'), ('B', '<f8'), ('C', '<f8'), ('D', '<f8'), ('E', '<f8'), ('F', '<f8'), ('timestamp', '<f8')])

Sie können auf eine benannte Spalte wie folgt zugreifen r['E']:

array([1715.37476, 1715.37476, 1715.37476])

Hinweis: In dieser Antwort wurde zuvor np.recfromcsv verwendet , um die Daten in ein NumPy-Datensatzarray einzulesen . Obwohl an dieser Methode nichts auszusetzen war, sind strukturierte Arrays aus Gründen der Geschwindigkeit und Kompatibilität im Allgemeinen besser als Record-Arrays.

Mike T.
quelle