web-dev-qa-db-de.com

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

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 kann ich jedoch nur ein ndarray mit 3 Zeilen (eine pro Zeile) und keinen Spalten aus der Numpy herausholen.

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 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 in verschiedene Dimensionen aufteilen und plotten kann, genau wie in Matlab.

68
dgorissen

Reine Taubheit

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önnten auch pandas.io.parsers.read_csv und erhalte das zugehörige Array numpy, das schneller sein kann.

136
Kaveh_kh

Ich denke, die Verwendung von dtype, wo es eine Namenszeile gibt, 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])
6
mtrw

Sie können eine CSV-Datei mit Kopfzeilen in ein NumPy Structured Array mit np.genfromtxt einlesen. Beispielsweise:

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))

was so aussieht:

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 diese 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-Datensatz-Array einzulesen. Während an dieser Methode nichts auszusetzen war, sind strukturierte Arrays im Allgemeinen aus Gründen der Geschwindigkeit und Kompatibilität besser als Record-Arrays.

4
Mike T