python - transpuesta - numpy read csv
cargue csv en matriz 2D con numpy para trazar (3)
Creo que usar dtype
donde hay una fila de nombres confunde la rutina. Tratar
>>> 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])
Dado este archivo CSV:
"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 cortarlo 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.
Numpy puro
numpy.loadtxt(open("test.csv", "rb"), delimiter=",", skiprows=1)
Consulte la documentación de loadtxt .
También puedes usar el módulo csv de python:
import csv
import numpy
reader = csv.reader(open("test.csv", "rb"), delimiter=",")
x = list(reader)
result = numpy.array(x).astype("float")
Tendrá que convertirlo a su tipo numérico favorito. Supongo que puedes escribir todo en una línea:
result = numpy.array(list(csv.reader(open("test.csv", "rb"), delimiter=","))).astype("float")
Sugerencia agregada:
También puede usar pandas.io.parsers.read_csv
y obtener la matriz numpy
asociada que puede ser más rápida.
Puede leer un archivo CSV con encabezados en una matriz estructurada NumPy con np.genfromtxt . Por ejemplo:
import numpy as np
csv_fname = ''file.csv''
with open(csv_fname, ''w'') as fp:
fp.write("""/
"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
""")
# Read the CSV file into a Numpy record array
r = np.genfromtxt(csv_fname, delimiter='','', names=True, case_sensitive=True)
print(repr(r))
que se ve así:
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 con nombre como este r[''E'']
:
array([1715.37476, 1715.37476, 1715.37476])
Nota: esta respuesta utilizó previamente np.recfromcsv para leer los datos en una matriz de registro NumPy . Si bien no había nada de malo con ese método, las matrices estructuradas son generalmente mejores que las matrices de registro para mayor velocidad y compatibilidad.