laad csv in 2D-matrix met numpy om te plotten

Gezien dit CSV-bestand:

"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

Ik wil het gewoon laden als een matrix/ndarray met 3 rijen en 7 kolommen. Om de een of andere reden kan ik alleen maar uit numpy komen, een ndarray met 3 rijen (één per regel) en geen kolommen.

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,)

Ik kan het handmatig herhalen en hacken in de vorm die ik wil, maar dit lijkt dwaas. Ik wil het gewoon als een echte matrix laden, zodat ik het over verschillende dimensies kan verdelen en het kan plotten, net als in matlab.


Antwoord 1, autoriteit 100%

Puur dom

numpy.loadtxt(open("test.csv", "rb"), delimiter=",", skiprows=1)

Bekijk de loadtxt-documentatie.

Je kunt ook de csv-module van Python gebruiken:

import csv
import numpy
reader = csv.reader(open("test.csv", "rb"), delimiter=",")
x = list(reader)
result = numpy.array(x).astype("float")

Je moet het converteren naar je favoriete numerieke type. Ik denk dat je het hele ding in één regel kunt schrijven:

result = numpy.array (lijst (csv.reader (open ("test.csv", "rb"), scheidingsliter = ","))). ASTYPE ("float")

Toegevoegd hint:

U kunt ook pandas.io.parsers.read_csvgebruiken en de bijbehorende numpyArray krijgen die sneller kan zijn.


Antwoord 2, Autoriteit 4%

Ik denk dat het gebruik van dtypewaar een naam rij is verwarrend de routine. Probeer

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

Antwoord 3, Autoriteit 3%

U kunt een CSV-bestand lezen met headers in een numpy gestructureerde array met np.genfromtxt . Bijvoorbeeld:

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))

die er als volgt uitziet:

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')])

Je hebt toegang tot een benoemde kolom zoals deze r['E']:

array([1715.37476, 1715.37476, 1715.37476])

Opmerking: dit antwoord gebruikte eerder np.recfromcsvom de gegevens in te lezen in een NumPy-recordarray. Hoewel er niets mis was met die methode, zijn gestructureerde arrays over het algemeen beter dan recordarrays voor snelheid en compatibiliteit.

Other episodes