플로팅을 위해 numpy를 사용하여 csv를 2D 행렬에로드


79

이 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

3 행과 7 열이있는 행렬 / ndarray로로드하고 싶습니다. 그러나 어떤 이유로 numpy에서 얻을 수있는 것은 3 개의 행 (한 줄에 하나씩)과 열이없는 ndarray뿐입니다.

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

수동으로 반복하고 원하는 모양으로 해킹 할 수 있지만 이것은 어리석은 것 같습니다. MATLAB 에서처럼 다른 차원으로 슬라이스하고 플로팅 할 수 있도록 적절한 행렬로로드하고 싶습니다.

답변:


153

순수한 numpy

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

loadtxt 문서를 확인하십시오 .

파이썬의 csv 모듈을 사용할 수도 있습니다 :

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

선호하는 숫자 유형으로 변환해야합니다. 나는 당신이 한 줄에 모든 것을 쓸 수 있다고 생각합니다.

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

추가 된 힌트 :

더 빠른 pandas.io.parsers.read_csv관련 numpy배열을 사용 하고 가져올 수도 있습니다.


skiprows = 1 플래그는 첫 번째 행을 건너 뛰고 모든 데이터를 유지하려는 경우 표준 활성화 플래그가 아니라고 추가합니다. 완벽하게 작동했습니다!
Arturo

loadtxt는 genfromtxt에서 names = True로 발생하는 열 이름도로드하지 않습니다
mhstnsc

물어봐도 open될까요? - 그 한 줄에 로컬입니까? 에서와 같이 파일이 줄 끝에서 닫히나요?
Daniel Soutar

예, 파일을 닫습니다. 참조 : stackoverflow.com/questions/8011797/…
Kaveh_kh

loadtxt너무 느리기 때문에 seocnd 방법을 사용하는 것이 좋습니다 . 또는 pandas목적을 위해 꽤 좋습니다
fireball.1

6

dtype이름 행이있는 곳에 사용 하는 것이 루틴을 혼란스럽게 한다고 생각 합니다. 시험

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

흥미롭게도 이것은 제 경우의 결과를 바꾸지 않습니다. 저는 Python 2.5와 numpy 1.4.1을 사용하고 있으므로 그게 문제
dgorissen

저는 Python 2.6과 NumPy 1.3.0을 사용하고 있습니다! 나는 더 오래된 행동을 더 좋아합니다.
mtrw 2010

4

헤더가있는 CSV 파일 을 np.genfromtxtNumPy 구조화 배열 로 읽을 수 있습니다 . 예를 들면 :

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

다음과 같이 보입니다.

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

다음과 같이 명명 된 열에 액세스 할 수 있습니다 r['E'].

array([1715.37476, 1715.37476, 1715.37476])

참고 :이 답변은 이전에 np.recfromcsv 를 사용 하여 데이터를 NumPy 레코드 배열 로 읽었습니다 . 이 방법에는 아무런 문제가 없었지만 구조화 된 배열은 일반적으로 속도와 호환성면에서 레코드 배열보다 낫습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.