web-dev-qa-db-fra.com

charge csv dans une matrice 2D avec numpy pour le traçage

É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.

68
dgorissen

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.

136
Kaveh_kh

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])
6
mtrw

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é.

4
Mike T