python numpy scipy genfromtxt

python - numpy genfromtxt csv



¿Cómo leo los datos CSV en una matriz de registros en NumPy? (10)

Me pregunto si hay una forma directa de importar el contenido de un archivo CSV a una matriz de registros, de forma muy parecida a la forma en que la read.table() , read.delim() y read.csv() de R importa datos a R ¿marco de datos?

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


Como probé de dos maneras usando NumPy y Pandas, usar pandas tiene muchas ventajas:

  • Más rápido
  • Menos uso de la CPU
  • Uso de 1/3 RAM en comparación con NumPy genfromtxt

Este es mi código de prueba:

$ for f in test_pandas.py test_numpy_csv.py ; do /usr/bin/time python $f; done 2.94user 0.41system 0:03.05elapsed 109%CPU (0avgtext+0avgdata 502068maxresident)k 0inputs+24outputs (0major+107147minor)pagefaults 0swaps 23.29user 0.72system 0:23.72elapsed 101%CPU (0avgtext+0avgdata 1680888maxresident)k 0inputs+0outputs (0major+416145minor)pagefaults 0swaps

test_numpy_csv.py

from numpy import genfromtxt train = genfromtxt(''/home/hvn/me/notebook/train.csv'', delimiter='','')

test_pandas.py

from pandas import read_csv df = read_csv(''/home/hvn/me/notebook/train.csv'')

Archivo de datos:

du -h ~/me/notebook/train.csv 59M /home/hvn/me/notebook/train.csv

Con NumPy y pandas en versiones:

$ pip freeze | egrep -i ''pandas|numpy'' numpy==1.13.3 pandas==0.20.2


Cronometre el

from numpy import genfromtxt genfromtxt(fname = dest_file, dtype = (<whatever options>))

versus

import csv import numpy as np with open(dest_file,''r'') as dest_f: data_iter = csv.reader(dest_f, delimiter = delimiter, quotechar = ''"'') data = [data for data in data_iter] data_array = np.asarray(data, dtype = <whatever options>)

en 4.6 millones de filas con alrededor de 70 columnas, se encontró que la ruta NumPy tomó 2 minutos y 16 segundos y el método de comprensión csv-list tomó 13 segundos.

Recomendaría el método de comprensión csv-list, ya que lo más probable es que se base en bibliotecas precompiladas y no en el intérprete tanto como en NumPy. Sospecho que el método de los pandas tendría una sobrecarga de intérprete similar.


Esta es la manera más fácil:

import csv with open(''testfile.csv'', newline='''') as csvfile: data = list(csv.reader(csvfile))

Ahora cada entrada en los datos es un registro, representado como una matriz. Así que tienes una matriz 2D. Me ahorró mucho tiempo.


Intenté esto:

import pandas as p import numpy as n closingValue = p.read_csv("<FILENAME>", usecols=[4], dtype=float) print(closingValue)


Puede usar el método genfromtxt() de genfromtxt() para hacerlo, configurando el delimiter kwarg a una coma.

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

Más información sobre la función se puede encontrar en su documentation respectiva.


Puede usar este código para enviar datos de archivos CSV a una matriz:

import numpy as np csv = np.genfromtxt(''test.csv'', delimiter=",") print(csv)


Recomendaría la función read_csv de la biblioteca de 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 proporciona un DataFrame pandas, que permite muchas funciones útiles de manipulación de datos que no están disponibles directamente con matrices de registros numpy .

DataFrame es una estructura de datos etiquetada bidimensional con columnas de tipos potencialmente diferentes. Puedes considerarlo como una hoja de cálculo o una tabla SQL ...

También recomendaría genfromtxt . Sin embargo, dado que la pregunta solicita una matriz de registro , a diferencia de una matriz normal, el parámetro dtype=None debe agregarse a la llamada genfromtxt :

Dado un archivo de entrada, myfile.csv :

1.0, 2, 3 4, 5.5, 6 import numpy as np np.genfromtxt(''myfile.csv'',delimiter='','')

da una matriz:

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

y

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

da una matriz de registro:

array([(1.0, 2.0, 3), (4.0, 5.5, 6)], dtype=[(''f0'', ''<f8''), (''f1'', ''<f8''), (''f2'', ''<i4'')])

Esto tiene la ventaja de que el archivo con múltiples tipos de datos (incluidas las cadenas) se puede importar fácilmente .


También puede probar recfromcsv() que puede adivinar los tipos de datos y devolver una matriz de registros con el formato correcto.


Usando numpy.loadtxt

Un método bastante simple. Pero requiere que todos los elementos estén flotando (int y así sucesivamente)

import numpy as np data = np.loadtxt(''c://1.csv'',delimiter='','',skiprows=0)


Yo sugeriría usar tablas ( pip3 install tables ). Puede guardar su archivo .csv en .h5 usando pandas ( pip3 install pandas ),

import pandas as pd data = pd.read_csv("dataset.csv") store = pd.HDFStore(''dataset.h5'') store[''mydata''] = data store.close()

Entonces puede fácilmente, y con menos tiempo, incluso para una gran cantidad de datos, cargar sus datos en una matriz NumPy .

import pandas as pd store = pd.HDFStore(''dataset.h5'') data = store[''mydata''] store.close() # Data in NumPy format data = data.values