2014-06-10 15 views
6

Ho un file csv con le intestazioni come:carico NumPy e le colonne di accesso per nome

Dato questo test.csv di file:

"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 

Voglio semplicemente caricarlo come una matrice/ndarray con 3 righe e 7 colonne e inoltre desidero accedere allo column vectors da un dato column name. Se uso genfromtxt (come mostrato di seguito) ottengo un narray con 3 righe (una per riga) e nessuna colonna.

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

posso ottenere vettori colonna di nomi di colonna simili:

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

Se, uso load.txt allora ottengo la matrice con 3 righe e 7 colonne ma non può accedere columns base alle column nomi (come mostrato di seguito).

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

ottengo

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

Esiste un approccio Python che posso raggiungere entrambi i requisiti insieme (access columns by coluumn name like np.genfromtext and have a matrix like np.loadtxt)?

risposta

6

Usando solo numpy, le opzioni visualizzate sono le uniche opzioni. Utilizzare un narray di dtype omogeneo con forma (3,7) o un array strutturato di dtype e forma (potenzialmente) eterogeneo (3,).

Se si vuole veramente una struttura di dati con le colonne etichettate e forma (3,7), (e un sacco di altri gadget) è possibile utilizzare un pandas dataframe:

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) 

A NumPy puro/alternativa Python sarebbe quella di utilizzare un dict per mappare i nomi delle colonne di indici:

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

rendimenti

[[ 611.88243] 
[ 611.88243] 
[ 611.88243]] 

questo modo, arr è una matrice NumPy, con colonne che si può accedere etichetta utilizzando la sintassi

arr[:, colmap[column_name]] 
+0

voglio una matrice NumPy (che sarà usato per la manipolazione della matrice futher) non array. – user2481422

+0

Le matrici di Numpy non hanno colonne accessibili dalle etichette. – unutbu

+0

Mi sto chiedendo l'efficienza temporale in questo caso. Inizialmente, ho pensato di caricare il file 'csv' in entrambi i file' loadtxt' e 'genfromtext' e accedere sia ai nomi di array che di colonne numpy, ma questo richiede troppo tempo. Sembra che anche questa soluzione sia simile, appena genfromtext viene sostituito con csv.reader (con più righe di codice). Il mio file csv è di 5 MB, quindi volevo una libreria che potesse fare entrambe le cose contemporaneamente. – user2481422

2

Poiché i dati è omogenea - è possibile - tutti gli elementi sono valori virgola mobile creare una vista dei dati restituiti da genfromtxt che è un array 2D. Ad esempio,

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

creare una matrice NumPy che è una "vista" r.Questo è un array NumPy regolare, ma viene creata utilizzando i dati in r:

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 e a riferiscono allo stesso blocco di memoria:

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

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