IT이야기

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

cyworld 2021. 4. 15. 21:49
반응형

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


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

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

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


기본적으로 np.genfromtxtuses dtype=float: 그래서 문자열 열이 NaN으로 변환되는 이유는 결국 숫자가 아니기 때문입니다.

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

>>> 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, complex, 그다음 문자열을 유지합니다. 다른 모든 것이 실패하면. 실제로 구현은 다소 투박합니다. 유형 추측을 더 효율적으로 만들려는 시도가 있었지만 (정규식 사용), 지금까지 멈춘 것은 없습니다.]


데이터 파일이 다음과 같은 구조 인 경우

col1, col2, col3
   1,    2,    3
  10,   20,   30
 100,  200,  300

그런 다음 옵션을 numpy.genfromtxt사용하여 첫 번째 행을 열 헤더로 해석 할 수 있습니다 names=True. 이를 통해 열 헤더를 제공하여 데이터에 매우 편리하게 액세스 할 수 있습니다.

data = np.genfromtxt('data.txt', delimiter=',', names=True)
print data['col1']    # array([   1.,   10.,  100.])
print data['col2']    # array([   2.,   20.,  200.])
print data['col3']    # array([   3.,   30.,  300.])

귀하의 경우 데이터는 다음과 같이 형성되기 때문에

row1,   1,  10, 100
row2,   2,  20, 200
row3,   3,  30, 300

다음 코드 스 니펫을 사용하여 비슷한 결과를 얻을 수 있습니다.

labels = np.genfromtxt('data.txt', delimiter=',', usecols=0, dtype=str)
raw_data = np.genfromtxt('data.txt', delimiter=',')[:,1:]
data = {label: row for label, row in zip(labels, raw_data)}

첫 번째 줄은 첫 번째 열 (레이블)을 문자열 배열로 읽습니다. 두 번째 줄은 파일에서 모든 데이터를 읽지 만 첫 번째 열은 삭제합니다. 세 번째 줄은 사전 이해력을 numpy.genfromtxt사용하여 names=True옵션을 사용하여 생성 하는 구조화 된 배열과 매우 유사하게 사용할 수있는 사전을 생성합니다 .

print data['row1']    # array([   1.,   10.,  100.])
print data['row2']    # array([   2.,   20.,  200.])
print data['row3']    # array([   3.,   30.,  300.])

data=np.genfromtxt(csv_file, delimiter=',', dtype='unicode')

그것은 나를 위해 잘 작동합니다.


다음을 사용할 수 있습니다 numpy.recfromcsv(filename). 각 열의 유형이 자동으로 결정되며 ( np.genfromtxt()와 함께 사용 하는 것처럼 dtype=None) 기본적으로 delimiter=",". 그것은 기본적으로 np.genfromtxt(filename, delimiter=",", dtype=None)Pierre GM이 그의 대답에서 지적한 지름길입니다 .


이 형식의 데이터 세트 :

CONFIG000   1080.65 1080.87 1068.76 1083.52 1084.96 1080.31 1081.75 1079.98
CONFIG001   414.6   421.76  418.93  415.53  415.23  416.12  420.54  415.42
CONFIG010   1091.43 1079.2  1086.61 1086.58 1091.14 1080.58 1076.64 1083.67
CONFIG011   391.31  392.96  391.24  392.21  391.94  392.18  391.96  391.66
CONFIG100   1067.08 1062.1  1061.02 1068.24 1066.74 1052.38 1062.31 1064.28
CONFIG101   371.63  378.36  370.36  371.74  370.67  376.24  378.15  371.56
CONFIG110   1060.88 1072.13 1076.01 1069.52 1069.04 1068.72 1064.79 1066.66
CONFIG111   350.08  350.69  352.1   350.19  352.28  353.46  351.83  350.94

이 코드는 내 응용 프로그램에서 작동합니다.

def ShowData(data, names):
    i = 0
    while i < data.shape[0]:
        print(names[i] + ": ")
        j = 0
        while j < data.shape[1]:
            print(data[i][j])
            j += 1
        print("")
        i += 1

def Main():
    print("The sample data is: ")
    fname = 'ANOVA.csv'
    csv = numpy.genfromtxt(fname, dtype=str, delimiter=",")
    num_rows = csv.shape[0]
    num_cols = csv.shape[1]
    names = csv[:,0]
    data = numpy.genfromtxt(fname, usecols = range(1,num_cols), delimiter=",")
    print(names)
    print(str(num_rows) + "x" + str(num_cols))
    print(data)
    ShowData(data, names)

Python-2 출력 :

The sample data is:
['CONFIG000' 'CONFIG001' 'CONFIG010' 'CONFIG011' 'CONFIG100' 'CONFIG101'
 'CONFIG110' 'CONFIG111']
8x9
[[ 1080.65  1080.87  1068.76  1083.52  1084.96  1080.31  1081.75  1079.98]
 [  414.6    421.76   418.93   415.53   415.23   416.12   420.54   415.42]
 [ 1091.43  1079.2   1086.61  1086.58  1091.14  1080.58  1076.64  1083.67]
 [  391.31   392.96   391.24   392.21   391.94   392.18   391.96   391.66]
 [ 1067.08  1062.1   1061.02  1068.24  1066.74  1052.38  1062.31  1064.28]
 [  371.63   378.36   370.36   371.74   370.67   376.24   378.15   371.56]
 [ 1060.88  1072.13  1076.01  1069.52  1069.04  1068.72  1064.79  1066.66]
 [  350.08   350.69   352.1    350.19   352.28   353.46   351.83   350.94]]
CONFIG000:
1080.65
1080.87
1068.76
1083.52
1084.96
1080.31
1081.75
1079.98

CONFIG001:
414.6
421.76
418.93
415.53
415.23
416.12
420.54
415.42

CONFIG010:
1091.43
1079.2
1086.61
1086.58
1091.14
1080.58
1076.64
1083.67

CONFIG011:
391.31
392.96
391.24
392.21
391.94
392.18
391.96
391.66

CONFIG100:
1067.08
1062.1
1061.02
1068.24
1066.74
1052.38
1062.31
1064.28

CONFIG101:
371.63
378.36
370.36
371.74
370.67
376.24
378.15
371.56

CONFIG110:
1060.88
1072.13
1076.01
1069.52
1069.04
1068.72
1064.79
1066.66

CONFIG111:
350.08
350.69
352.1
350.19
352.28
353.46
351.83
350.94

참조 URL : https://stackoverflow.com/questions/12319969/how-to-use-numpy-genfromtxt-when-first-column-is-string-and-the-remaining-column

반응형