Hoe lees ik CSV-gegevens in een recordarray in Numpy?

Ik vraag me af of er een directe manier is om de inhoud van een CSV-bestand in een recordarray te importeren, veel in de manier waarop R’s read.table(), read.delim(), en read.csv()familie importeert gegevens naar r’s gegevensframe?

of is de beste manier om csv.reader () en breng dan zoiets aan als numpy.core.records.fromrecords()?


Antwoord 1, Autoriteit 100%

U kunt Numpy’s genfromtxt()-methode gebruiken om dit te doen, door de delimiterKWARG aan een komma in te stellen.

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

Meer informatie over de functie is te vinden op zijn respectieve Documentatie .


Antwoord 2, Autoriteit 28%

Ik zou het read_csvfunctie van de pandasbibliotheek:

import pandas as pd
df=pd.read_csv('myfile.csv', sep=',',header=None)
df.values
array([[ 1. ,  2. ,  3. ],
       [ 4. ,  5.5,  6. ]])

Dit geeft een Panda’s dataframe – toestaan ​​Veel nuttige gegevensmanipulatiefuncties die niet direct beschikbaar zijn met Numpy Record-arrays .

DataFrame is een 2-dimensionaal gelabelde datastructuur met kolommen van
mogelijk verschillende soorten. Je kunt het zien als een spreadsheet of
SQL-tabel…


Ik zou ook genfromtxtaanraden. Aangezien de vraag echter om een recordarrayvraagt, in tegenstelling tot naar een normale array, moet de parameter dtype=Noneworden toegevoegd aan de genfromtxt-aanroep:

Gegeven een invoerbestand, myfile.csv:

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

geeft een array:

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

en

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

geeft een recordarray:

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

Dit heeft als voordeel dat bestanden met meerdere gegevenstypen (inclusief strings) eenvoudig kunnen worden geïmporteerd.


Antwoord 3, autoriteit 11%

Ik heb de

. getimed

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

tegen

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

op 4,6 miljoen rijen met ongeveer 70 kolommen en ontdekte dat het NumPy-pad 2 min 16 seconden duurde en de methode voor het begrijpen van csv-lijst 13 seconden.

Ik zou de methode voor het begrijpen van csv-lijst aanbevelen, omdat deze hoogstwaarschijnlijk afhankelijk is van vooraf gecompileerde bibliotheken en niet zozeer van de interpreter als van NumPy. Ik vermoed dat de panda-methode een vergelijkbare overhead voor de interpreter zou hebben.


Antwoord 4, autoriteit 9%

Je kunt ook recfromcsv()die gegevenstypen kan raden en een correct opgemaakte recordarray kan retourneren.


Antwoord 5, autoriteit 3%

Omdat ik beide manieren heb geprobeerd met NumPy en Panda’s, heeft het gebruik van panda’s veel voordelen:

  • Sneller
  • Minder CPU-gebruik
  • 1/3 RAM-gebruik vergeleken met NumPy genfromtxt

Dit is mijn testcode:

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

Gegevensbestand:

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

Met NumPy en panda’s in versies:

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

Antwoord 6

U kunt deze code gebruiken om CSV-bestandsgegevens naar een array te sturen:

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

Antwoord 7

Ik raad aan tabellen te gebruiken (pip3 install tables). Je kunt je .csv-bestand opslaan in .h5met behulp van panda’s (pip3 install pandas),

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

U kunt dan gemakkelijk en met minder tijd, zelfs voor enorme hoeveelheden gegevens, uw gegevens in een NumPy-arrayladen.

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

Antwoord 8

Dit is de gemakkelijkste manier:

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

Nu is elke invoer in gegevens een record, weergegeven als een array. Je hebt dus een 2D-array. Het heeft me zoveel tijd bespaard.


Antwoord 9

Met behulp van numpy.loadtxt

Een vrij eenvoudige methode. Maar het vereist dat alle elementen float zijn (int enzovoort)

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

Antwoord 10

Dit werkt als een charme…

import csv
with open("data.csv", 'r') as f:
    data = list(csv.reader(f, delimiter=";"))
import numpy as np
data = np.array(data, dtype=np.float)

Antwoord 11

Ik heb dit geprobeerd:

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

Antwoord 12

In [329]: %time my_data = genfromtxt('one.csv', delimiter=',')
CPU times: user 19.8 s, sys: 4.58 s, total: 24.4 s
Wall time: 24.4 s
In [330]: %time df = pd.read_csv("one.csv", skiprows=20)
CPU times: user 1.06 s, sys: 312 ms, total: 1.38 s
Wall time: 1.38 s

Other episodes