¿Cómo puedo leer datos CSV en una matriz de registros en NumPy?

Me pregunto si existe una forma directa de importar el contenido de un archivo CSV a una matriz de registros, del mismo modo que las familias read.table(), read.delim() y read.csv() importan datos al marco de datos de R's?

¿O la mejor manera es utilizar csv.reader() y luego aplicar algo como numpy.core.records.fromrecords()?

Solución

Puede utilizar el método genfromtxt() de Numpy para hacerlo, estableciendo el kwarg delimiter a una coma.

from numpy import genfromtxt
my_data = genfromtxt('my_file.csv', delimiter=',')

Puede encontrar más información sobre la función en su respectiva documentación.

Comentarios (6)

Yo recomendaría la función [read_csv][1] de la biblioteca pandas:

import pandas as pd
df=pd.read_csv('myfile.csv', sep=',',header=None)
df.values
array([[ 1. ,  2. ,  3. ],
       [ 4. ,  5.5,  6. ]])

Esto da un [DataFrame][2] de pandas - permitiendo [muchas funciones útiles de manipulación de datos que no están disponibles directamente con arrays de registros de numpy][3].

DataFrame es una estructura de datos etiquetada de 2 dimensiones con columnas de potencialmente de diferentes tipos. Puedes pensar en ello como una hoja de cálculo o tabla SQL...


Yo también recomendaría genfromtxt. Sin embargo, como la pregunta pide un [array de registros][4], en lugar de un array normal, hay que añadir el parámetro dtype=None a la llamada genfromtxt:

Dado un archivo de entrada, miarchivo.csv:

1.0, 2, 3
4, 5.5, 6

import numpy as np
np.genfromtxt('myfile.csv',delimiter=',')

da un array:

array([[ 1. ,  2. ,  3. ],
       [ 4. ,  5.5,  6. ]])

y

np.genfromtxt('myfile.csv',delimiter=',',dtype=None)

da una matriz de registros:


array([(1.0, 2.0, 3), (4.0, 5.5, 6)], 
      dtype=[('f0', '
Comentarios (3)

También puede probar recfromcsv() que puede adivinar los tipos de datos y devolver un array de registros con el formato adecuado.

Comentarios (1)