2010-11-30 9 views
48

Dado este archivo CSV:csv carga en la matriz 2D con numpy para el trazado

"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 

Simplemente quiero cargarlo como una matriz/ndarray con 3 filas y 7 columnas. Sin embargo, por alguna razón, todo lo que puedo sacar de numpy es una ndarray con 3 filas (una por línea) y sin columnas.

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

Puedo iterar manualmente y hackearlo en la forma que quiero, pero parece una tontería. Solo quiero cargarlo como una matriz adecuada para poder cortarlo en diferentes dimensiones y trazarlo, como en matlab.

Respuesta

109

numpy puro

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

Mira la documentación loadtxt.

También puede utilizar el módulo csv de pitón:

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

que tendrá que convertirlo a su tipo numérico favorito. Creo que se puede escribir todo el asunto en una línea:

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

Agregado Consejo:

También es posible usar pandas.io.parsers.read_csv y obtener el correspondiente numpy gama que puede ser más rápido.

+0

loadtext hace el truco, gracias! – dgorissen

+0

Agregaría que el indicador skiprows = 1 omite la primera fila, y no es un indicador de activación estándar si desea conservar todos los datos. Funcionó a la perfección! – Arturo

+0

loadtxt no carga también los nombres de columna que suceden con names = True en genfromtxt – mhstnsc

4

Creo que el uso de dtype donde hay una fila de nombre confunde la rutina. Trate

>>> 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]) 
+0

Curiosamente, esto no cambia el resultado en mi caso. Estoy usando Python 2.5 y numpy 1.4.1 así que tal vez ese es el problema – dgorissen

+0

¡Estoy usando Python 2.6 y NumPy 1.3.0! Me gusta el comportamiento anterior mejor. – mtrw

3

Puede leer un archivo CSV con encabezados en un NumPy record array con np.recfromcsv. Por ejemplo:

import numpy as np 
import StringIO 

csv_text = """\ 
"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 
""" 
# Make a file-like object 
csv_file = StringIO.StringIO(csv_text) 
csv_file.seek(0) 

# Read the CSV file into a Numpy record array 
r = np.recfromcsv(csv_file, case_sensitive=True) 
print(repr(r)) 

que se parece a esto:

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

puede acceder a una columna llamada como esto r['E']:

array([ 1715.37476, 1715.37476, 1715.37476]) 
Cuestiones relacionadas