Étant donné ce fichier 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
Je veux simplement le charger en tant que matrice/ndarray avec 3 lignes et 7 colonnes. Cependant, pour une raison quelconque, tout ce que je peux obtenir de numpy est un ndarray avec 3 lignes (une par ligne) et aucune colonne.
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,)
Je peux manuellement itérer et pirater dans la forme que je veux, mais cela semble idiot. Je souhaite simplement le charger en tant que matrice appropriée afin de pouvoir le découper selon différentes dimensions et le représenter graphiquement, comme dans matlab.
Pure numpy
numpy.loadtxt(open("test.csv", "rb"), delimiter=",", skiprows=1)
Consultez la documentation loadtxt .
Vous pouvez également utiliser le module csv de python:
import csv
import numpy
reader = csv.reader(open("test.csv", "rb"), delimiter=",")
x = list(reader)
result = numpy.array(x).astype("float")
Vous devrez le convertir en votre type numérique préféré. Je suppose que vous pouvez écrire le tout en une ligne:
resultat = numpy.array (liste (csv.reader (open ("test.csv", "test.csv", "test.csv", "test.csv", "test.csv" ")," rb ")), délimiteur =", "))). astype (" float ")
Indice ajouté:
Vous pouvez aussi utiliser pandas.io.parsers.read_csv
et obtenez le tableau associé numpy
qui peut être plus rapide.
Je pense que l'utilisation de dtype
où il y a une ligne de nom confond la routine. Essayer
>>> 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])
Vous pouvez lire un fichier CSV avec des en-têtes dans un tableau structuré NumPy avec np.genfromtxt . Par exemple:
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))
qui ressemble à ceci:
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')])
Vous pouvez accéder à une colonne nommée comme ceci r['E']
:
array([1715.37476, 1715.37476, 1715.37476])
Remarque: cette réponse utilisait précédemment np.recfromcsv pour lire les données dans un tableau d'enregistrements NumPy . Bien qu'il n'y ait rien de mal avec cette méthode, les tableaux structurés sont généralement meilleurs que les tableaux d'enregistrement en termes de rapidité et de compatibilité.