포스트

Structured-Data-NumPy

Structured-Data-NumPy

Structured-Data-NumPy

구조화된 배열 만들기

복합 데이터 타입

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import numpy as np

name = ['Alice', 'Bob', 'Cathy', 'Doug']
age = [25, 45, 37, 19]
weight = [55.0, 85.5, 68.0, 61.5]

# 딕셔너리
# U10 --> 최대 길이 10을 갖는 유니코드 문자열
# i4 --> 4바이트(32비트) 정수
# f8 --> 8바이트(64비트) 부동 소수점
data = np.zeros(4, dtype={'names': ('name', 'age', 'weight'), 'formats': ('U10', 'i4', 'f8')})
print("data.dtype: ", data.dtype)

data['name'] = name
data['age'] = age
data['weight'] = weight
print("\ndata:\n", data)

# 특정 값 가져오기
print("\ndata['name']:", data['name'])
print("data[0]:", data[0])
print("data[-1]['name']:", data[-1]['name'])
print("data[data['age'] < 30]['name']:", data[data['age'] < 30]['name'])
1
2
3
4
5
6
7
8
9
10
data.dtype:  [('name', '<U10'), ('age', '<i4'), ('weight', '<f8')]

data:
 [('Alice', 25, 55. ) ('Bob', 45, 85.5) ('Cathy', 37, 68. )
 ('Doug', 19, 61.5)]

data['name']: ['Alice' 'Bob' 'Cathy' 'Doug']
data[0]: ('Alice', 25, 55.)
data[-1]['name']: Doug
data[data['age'] < 30]['name']: ['Alice' 'Doug']
1
2
3
4
5
6
# 숫자 타입 --> 파이썬 타입이나 NumPy dtype으로 지정 가능
np.dtype({'names': ('name', 'age', 'weight'), 'formats': ((np.str_, 10), int, np.float32)})
# 튜플 리스트
np.dtype([('name', 'S10'), ('age', 'i4'), ('weight', 'f8')])
# 타입만 지정
np.dtype('S10,i4,f8')
1
dtype([('f0', 'S10'), ('f1', '<i4'), ('f2', '<f8')])

NumPy 데이터 타입

문자설명예제
'b'Byte(바이트)np.dtype('b')
'i'Signed integer(부호 있는 정수)np.dtype('i4') == np.int32
'u'Unsigned integer(부호 없는 정수)np.dtype('u1') == np.uint8
'f'Floating point(부동 소수점)np.dtype('f8') == np.int64
'c'Complex floating point(복소수 부동 소수점)np.dtype('c16') == np.complex128
'S', 'a'String(문자열)np.dtype('S5')
'U'Unicode string(유니코드 문자열)np.dtype('U') == np.str_
'V'Raw data (void)(원시데이터)np.dtype('V') == np.void

고급 복합 타입

1
2
3
4
5
# dtype은 C구조체 정의에 직접 매핑 --> 배열 내용 포함하는 버퍼에 직접 접근
tp = np.dtype([('id', 'i8'), ('mat', 'f8', (3, 3))])
X = np.zeros(1, dtype=tp)
print(X[0])
print(X['mat'][0])
1
2
3
4
(0, [[0., 0., 0.], [0., 0., 0.], [0., 0., 0.]])
[[0. 0. 0.]
 [0. 0. 0.]
 [0. 0. 0.]]

레코드 배열 RecordArrays

1
2
3
4
5
6
7
print(data['age'])

# 레코드 배열 --> 필드에 접근 시 동일 구문을 사용해도 오버헤드 발생
data_rec = data.view(np.recarray)
print(data_rec.age)

# 두 방법 중 필요에 따라 선택
1
2
[25 45 37 19]
[25 45 37 19]
1
이 기사는 저작권자의 CC BY-NC 4.0 라이센스를 따릅니다.