본문 바로가기
파이썬

파이썬 첫 번째 열이 문자열이고 나머지 열이 숫자 일 때 numpy.genfromtxt를 사용하는 방법은 무엇입니까?

by º기록 2021. 2. 7.
반응형

기본적으로 첫 번째 열이 문자열 (레이블)이고 나머지 열이 숫자 값인 데이터가 많이 있습니다. 다음을 실행합니다.

data = numpy.genfromtxt('data.txt', delimiter = ',')

이것은 대부분의 데이터를 잘 읽지 만 레이블 열은 'nan'이됩니다. 어떻게 처리 할 수 ​​있습니까?

 

해결 방법

 

기본적으로 np.genfromtxt dtype = float 를 사용합니다. 따라서 문자열 열이 NaN으로 변환되는 이유는 결국 숫자가 아니기 때문입니다.

dtype = None 을 사용하여 np.genfromtxt 에 열의 실제 유형을 추측하도록 요청할 수 있습니다.

>>> from StringIO import StringIO
>>> test = "a,1,2\nb,3,4"
>>> a = np.genfromtxt(StringIO(test), delimiter=",", dtype=None)
>>> print a
array([('a',1,2),('b',3,4)], dtype=[('f0', '|S1'),('f1', '<i8'),('f2', '<i8')])

a [ 'f0'] ...과 같은 이름을 사용하여 열에 액세스 할 수 있습니다.

열이 무엇인지 모르는 경우 dtype = None 을 사용하는 것이 좋습니다. 어떤 유형이 있어야하는지 이미 알고 있다면 명시적인 dtype 을 제공 할 수 있습니다. 예를 들어 테스트에서 첫 번째 열은 문자열이고 두 번째 열은 정수이며 세 번째 열은 부동 소수점이되기를 원합니다. 그런 다음

>>> np.genfromtxt(StringIO(test), delimiter=",", dtype=("|S10", int, float))
array([('a', 1, 2.0), ('b', 3, 4.0)], 
      dtype=[('f0', '|S10'), ('f1', '<i8'), ('f2', '<f8')])

명시 적 dtype 을 사용하는 것이 dtype = None 을 사용하는 것보다 훨씬 효율적이며 권장되는 방법입니다.

두 경우 모두 ( dtype = None 또는 명시적이고 비 동종 dtype ) 구조화 된 배열이됩니다.

[참고 : dtype = None 을 사용하면 입력이 두 번 구문 분석되고 각 열의 유형이 가능한 더 큰 유형과 일치하도록 업데이트됩니다. 먼저 bool을 시도한 다음 int를 시도한 다음 float를 시도합니다. , 컴플렉스, 다른 모든 것이 실패하면 문자열을 유지합니다. 실제로 구현은 다소 투박합니다. 유형 추측을보다 효율적으로 만들려는 시도가 있었지만 (정규식 사용), 지금까지 멈춘 것은 없습니다.]

 

참조 페이지 https://stackoverflow.com/questions/12319969

 

 

반응형

댓글