2016-07-26 2 views
1

numfrom에서 genfromtxt의 I/O 기능을 배우고 있습니다. 나는 numpy의 사용자 가이드에서 예제를 시도해 보았습니다. genfromtxt의 주석 인수에 관한 것입니다.numpy에서 genfromtxt의 주석 인자

>>> data = """# 
... # Skip me ! 
... # Skip me too ! 
... 1, 2 
... 3, 4 
... 5, 6 #This is the third line of the data 
... 7, 8 
... # And here comes the last line 
... 9, 0 
... """ 
>>> np.genfromtxt(StringIO(data), comments="#", delimiter=",") 
[[ 1. 2.] 
[ 3. 4.] 
[ 5. 6.] 
[ 7. 8.] 
[ 9. 0.]] 

내가 아래 시도 :

결과가 나온다 :

genfromtxt : 여기

는 NumPy와의 사용자 가이드의 예이다 빈 입력 파일 : "< _io.BytesIO object at 0x0000020555DC5EB8> " warnings.warn ('genfromtxt : 빈 입력 파일 :"% s "'% fname)

데이터에 문제가 있음을 알고 있습니다. 누구나이 예에서와 같이 데이터를 설정하는 방법을 가르쳐 줄 수 있습니까? 고마워요.

+0

첫 번째 genfromtxt 매개 변수에 대해 BytesIO 대신 StringIO를 시도하십시오. – Jonas

+2

왜 데이터에 백 슬래시를 삽입 했습니까? – BrenBarn

답변

0

다음을 시도해보십시오. 먼저 "\"을 사용하지 마세요. 둘째, 왜 당신은 내가 할 수있는 ipython3 (py3) 대화 형 세션에서 .BytesIO() 사용 StringIO()

import numpy as np 
from StringIO import StringIO 

data = """#     
    # Skip me !  
    # Skip me too !  
    1, 2     
    3, 4     
    5, 6 #This is the third line of the data  
    7, 8     
    # And here comes the last line 
    9, 0     
    """ 

    np.genfromtxt(StringIO(data), comments="#", delimiter=",") 

    array([[ 1., 2.], 
      [ 3., 4.], 
      [ 5., 6.], 
      [ 7., 8.], 
      [ 9., 0.]]) 
+0

고맙습니다. 모든 "\"를 삭제 한 후에 결과를 얻을 수 있습니다. python3.5를 사용 중이므로 .BytesIO()를 사용해야합니다. –

+0

py3을 사용하지 않으므로 그 문제는 없습니다. 행운을 빈다. – Merlin

0

을 사용하고 있습니다 :

Python3에서
In [326]: data = b"""# 
    ...: ... # Skip me ! 
    ...: ... # Skip me too ! 
    ...: ... 1, 2 
    ...: ... 3, 4 
    ...: ... 5, 6 #This is the third line of the data 
    ...: ... 7, 8 
    ...: ... # And here comes the last line 
    ...: ... 9, 0 
    ...: ... """ 
In [327]: 
In [327]: data 
Out[327]: b'#\n# Skip me !\n# Skip me too !\n1, 2\n3, 4\n5, 6 #This is the third line of the data\n7, 8\n# And here comes the last line\n9, 0\n' 
In [328]: np.genfromtxt(data.splitlines(),comments='#', delimiter=',') 
Out[328]: 
array([[ 1., 2.], 
     [ 3., 4.], 
     [ 5., 6.], 
     [ 7., 8.], 
     [ 9., 0.]]) 

, 문자열 바이트 필요; Py2에서는 이것이 기본값입니다.

멀티 라인 문자열 입력 (트리플 따옴표)은 \을 사용하지 마십시오. 그것은 연속입니다. 명시 적 \n

data = '#\n# Skip me\n...' 

: 당신은 내가 사용할 수 있었던 \n

data = b""" 
one 
two 
""" 

공지 사항을 유지하려는.

genfromtxt은 줄을 제공하는 반복 가능 함수와 함께 작동합니다. 그래서 나는 splitlines로 생산 된 라인리스트를 주었다. StringIO (또는 Py3의 경우 ByteIO)도 작동하지만 추가 작업이 필요합니다.

물론 다른 옵션은 텍스트 편집기에 해당 행을 복사하여 간단한 텍스트 파일로 저장하는 것입니다. 대화 형 세션에 복사하여 붙여 넣기하면 손쉽게 단축 할 수 있지만 꼭 필요한 것은 아닙니다.

In [329]: data.splitlines() 
Out[329]: 
[b'#', 
b'# Skip me !', 
b'# Skip me too !', 
b'1, 2', 
b'3, 4', 
b'5, 6 #This is the third line of the data', 
b'7, 8', 
b'# And here comes the last line', 
b'9, 0'] 
+0

. @ hpaulj는 py3에서 StringIO가 다르게 작동하지만 py3에서는 그렇지 않습니다. – Merlin

+0

여러 줄 입력 방법을 이용해 주셔서 감사합니다. 트리플 따옴표에 문제가 있습니다. "\" –

+0

'genfromtxt'는 입력이 바이트 문자열 (유니 코드 없음)이 될 것으로 예상합니다.Py3는 유니 코드 문자열을 기본 형식으로 사용하고'StringIO'는 기본값 (버전에 관계없이)을 처리합니다. 이것은 2와 3 사이의 2 번째로 가장 흔한 차이입니다 (가장 일반적인 것은 print (...) 표현식입니다). – hpaulj