2014-06-10 7 views
6

Ich habe eine csv Datei mit Header wie:Last CSV-Datei numpy und Zugang Spalten mit Namen

Vor dieser test.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 eine Matrix/ndarray laden mit 3 Zeilen und 7 Spalten und ich möchte auch auf die column vectors von einem gegebenen column name zugreifen. Wenn ich genfromtxt benutze (wie unten gezeigt), bekomme ich ein ndarray mit 3 Zeilen (eine pro Zeile) und keine Spalten.

r = np.genfromtxt('test.csv',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 Spaltenvektoren von Spaltennamen wie diese:

print r['A'] 
    [ 611.88243 611.88243 611.88243] 

Wenn ich load.txt dann bekomme ich das Array mit drei Zeilen und 7 Spalten aber columns nicht unter Verwendung der column Namen zugreifen kann (wie unten gezeigt).

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

ich

[ [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] ] 

Gibt es einen Ansatz in Python, dass ich beide zusammen die Anforderungen erreichen können (access columns by coluumn name like np.genfromtext and have a matrix like np.loadtxt)?

Antwort

6

Wenn Sie nur numpy verwenden, sind die angezeigten Optionen die einzigen Optionen. Verwenden Sie entweder ein NDarray mit homogenem D-Typ mit Form (3,7) oder ein strukturiertes Array mit (potenziell) heterogenem D-Typ und Form (3,).

Wenn Sie wirklich eine Datenstruktur mit markierten Spalten und Form (3,7) wollen, (und viele andere Leckereien) können Sie einen pandas Datenrahmen verwenden:

In [67]: import pandas as pd 
In [68]: df = pd.read_csv('data'); df 
Out[68]: 
      A   B  C   D   E   F  timestamp 
0 611.88243 9089.5601 5133 864.07514 1715.37476 765.22777 1.291112e+12 
1 611.88243 9089.5601 5133 864.07514 1715.37476 765.22777 1.291113e+12 
2 611.88243 9089.5601 5133 864.07514 1715.37476 765.22777 1.291121e+12  

In [70]: df['A'] 
Out[70]: 
0 611.88243 
1 611.88243 
2 611.88243 
Name: A, dtype: float64 

In [71]: df.shape 
Out[71]: (3, 7) 

Eine reine NumPy/Python Alternative wäre ein dict zu verwenden, um die Spaltennamen auf Indizes abzubilden:

import numpy as np 
import csv 
with open(filename) as f: 
    reader = csv.reader(f) 
    columns = next(reader) 
    colmap = dict(zip(columns, range(len(columns)))) 

arr = np.matrix(np.loadtxt(filename, delimiter=",", skiprows=1)) 
print(arr[:, colmap['A']]) 

Ausbeuten

[[ 611.88243] 
[ 611.88243] 
[ 611.88243]] 

Auf diese Weise arr ist eine NumPy Matrix mit Spalten, die

durch Etikett mit der Syntax zugegriffen werden kann
arr[:, colmap[column_name]] 
+0

Ich möchte ein numpy Matrix (das wird verwendet für weitere Matrixmanipulation) nicht Array. – user2481422

+0

Numpy-Matrizen verfügen nicht über Spalten, auf die durch Labels zugegriffen werden kann. – unutbu

+0

Ich frage mich die Zeiteffizienz in diesem Fall. Zuerst dachte ich daran, die 'csv'-Datei in' loadtxt' und 'genfromtext' zu laden und sowohl auf numpy Array- als auch auf Spaltennamen zuzugreifen, aber das dauert zu lange. Es scheint, dass diese Lösung auch nur genffromtext mit csv.reader (mit mehr Zeilen Code) ersetzt wird. Meine csv-Datei hat 5 MB, also wollte ich eine Bibliothek, die beides gleichzeitig kann. – user2481422

2

Da Ihre Daten homogen ist - alle Elemente Punktwerte schweben - Sie können Erstellen Sie eine Ansicht der von genfromtxt zurückgegebenen Daten, die ein 2D-Array ist. Zum Beispiel

In [42]: r = np.genfromtxt("test.csv", delimiter=',', names=True) 

erstellen numpy-Array, das eine "Ansicht" von r ist.Dies ist eine regelmäßige numpy Array, aber es ist, die Daten in r erstellt mit:

In [43]: a = r.view(np.float64).reshape(len(r), -1) 

In [44]: a.shape 
Out[44]: (3, 7) 

In [45]: a[:, 0] 
Out[45]: array([ 611.88243, 611.88243, 611.88243]) 

In [46]: r['A'] 
Out[46]: array([ 611.88243, 611.88243, 611.88243]) 

r und a auf den gleichen Speicherblock beziehen:

In [47]: a[0, 0] = -1 

In [48]: r['A'] 
Out[48]: array([ -1.  , 611.88243, 611.88243]) 
Verwandte Themen