첫 번째 열이 문자열이고 나머지 열이 숫자 일 때 numpy.genfromtxt를 사용하는 방법은 무엇입니까?
기본적으로 첫 번째 열이 문자열 (레이블)이고 나머지 열이 숫자 값인 데이터가 많이 있습니다. 다음을 실행합니다.
data = numpy.genfromtxt('data.txt', delimiter = ',')
이것은 대부분의 데이터를 잘 읽지 만 레이블 열은 'nan'이됩니다. 어떻게 처리 할 수 있습니까?
기본적으로 np.genfromtxt
uses 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
'IT이야기' 카테고리의 다른 글
libgmp-10.dll이 누락되었습니다. (0) | 2021.04.15 |
---|---|
빈 Seq에 대한 Option [T]의 최소 / 최대? (0) | 2021.04.15 |
Passport.js 인증 실패시 JSON 응답을 다시 보내기 (0) | 2021.04.15 |
Spring @Value가 속성 파일의 값으로 확인되지 않을 경우 (0) | 2021.04.15 |
Spring JUnit : autowired component에서 autowired component를 모의하는 방법 (0) | 2021.04.14 |