[python] NumPy에서 CSV 데이터를 레코드 배열로 읽는 방법은 무엇입니까?

나는 많은 방법으로, 기록 배열로 CSV 파일의 내용을 가져올 수있는 직접적인 방법이 있는지 궁금 개의 R read.table(), read.delim()read.csv()R의 데이터 프레임에 가족의 수입 데이터?

또는 csv.reader () 를 사용 하고 다음과 같은 것을 적용 하는 가장 좋은 방법 numpy.core.records.fromrecords()입니까?



답변

kwarg를 쉼표로 genfromtxt()설정하여 Numpy의 방법을 사용할 수 있습니다 delimiter.

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

기능에 대한 자세한 내용은 해당 설명서를 참조하십시오 .


답변

라이브러리 에서 read_csv함수를 권장합니다 pandas.

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

이것은 pandas DataFrame을 제공하여 numpy 레코드 배열에서 직접 사용할 수없는 많은 유용한 데이터 조작 기능을 허용 합니다 .

DataFrame은 잠재적으로 다른 유형의 열이있는 2 차원 레이블이 지정된 데이터 구조입니다. 스프레드 시트 또는 SQL 테이블처럼 생각할 수 있습니다 …


나는 또한 추천 할 것이다 genfromtxt. 그러나 질문은 일반 배열과 달리 레코드 배열을 요청 하므로 dtype=None매개 변수를 genfromtxt호출에 추가해야합니다 .

입력 파일이 주어지면 myfile.csv:

1.0, 2, 3
4, 5.5, 6

import numpy as np
np.genfromtxt('myfile.csv',delimiter=',')

배열을 제공합니다.

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

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

레코드 배열을 제공합니다.

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

이는 여러 데이터 유형 (문자열 포함)을 가진 파일을 쉽게 가져올 수 있다는 장점이 있습니다 .


답변

나는 시간을

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

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

약 70 개의 열이있는 460 만 개의 행에서 NumPy 경로가 2 분 16 초가 걸리고 csv-list 이해 방법이 13 초가 걸렸다는 것을 발견했습니다.

csv-list 이해 방법은 NumPy만큼의 인터프리터가 아닌 사전 컴파일 된 라이브러리에 의존하기 때문에 권장합니다. 나는 판다 방법이 비슷한 해석기 오버 헤드를 가질 것이라고 생각합니다.


답변

또한 recfromcsv()데이터 형식을 추측하고 올바른 형식의 레코드 배열을 반환 할 수 있습니다.


답변

NumPy와 Pandas를 사용하여 두 가지 방법을 시도했지만 팬더를 사용하면 많은 이점이 있습니다.

  • 더 빠른
  • 적은 CPU 사용량
  • NumPy genfromtxt에 비해 1/3 RAM 사용

이것은 내 테스트 코드입니다.

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

데이터 파일:

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

버전에서 NumPy 및 pandas 사용 :

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


답변

이 코드를 사용하여 CSV 파일 데이터를 배열로 보낼 수 있습니다.

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


답변

사용 numpy.loadtxt

아주 간단한 방법입니다. 그러나 모든 요소가 부동이어야합니다 (int 등)

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