Studio KimHippo :D

[Python / NumPy] 8. NumPy의 구조화된 배열 본문

Python Study/NumPy

[Python / NumPy] 8. NumPy의 구조화된 배열

김작은하마 2019. 7. 8. 16:19
# -*- coding : utf-8 -*-
import numpy as np

# NOTE : NumPy의 구조화된 배열

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

# NOTE : 빈 컨테이너 배열 생성
data = np.zeros(4, dtype = {'names' : ('name', 'age', 'weight'),
                            'formats' : ('U10', 'i4', 'f8')})

data['name'] = name
data['age'] = age
data['weight'] = weight

data

Out [1] :

array([('Alice', 25, 55. ), ('Bob', 45, 85.5), ('Cathy', 37, 68. ),
       ('Doug', 19, 61.5)],
      dtype=[('name', '<U10'), ('age', '<i4'), ('weight', '<f8')])

# NOTE : 전체 이름 가져오기
print(data['name'])

# NOTE : 데이터의 첫 번째 행 가져오기
print(data[0])

# NOTE : 마지막 행의 이름가져오기
print(data[-1]['name'])

# NOTE : 나이가 30 이하인 이름 가져오기
data[data['age'] < 30]['name']

Out [1] :

['Alice' 'Bob' 'Cathy' 'Doug']

 

Out [2] :
('Alice', 25, 55.)

 

Out [3] :
Doug

 

Out [4] :

array(['Alice', 'Doug'], dtype='<U10')

# NOTE : 고급 복합 타입
# mat, f8, (3, 3) : 3x3 부동 소수점 행렬로 구성됨.
tp = np.dtype([('id', 'i8'), ('mat', 'f8', (3, 3))])
x = np.zeros(1, dtype = tp)

print(x[0], '\n')
print(x['mat'][0])

Out [1] :

(0, [[0., 0., 0.], [0., 0., 0.], [0., 0., 0.]]) 

 

Out [2] :
[[0. 0. 0.]
 [0. 0. 0.]
 [0. 0. 0.]]

# NOTE : 레코드 배열
# 구조화 된 배열과 거의 동일하지만, 딕셔너리 키 대신 속성으로 필드에 접근할 수 있음.

data_rec = data.view(np.recarray)

# NOTE
# 단점 : 동일한 구문을 사용해도 부가적인 오버헤드가 발생.
%timeit data['age']
%timeit data_rec['age']
%timeit data_rec.age

Out [1] :

193 ns ± 31.7 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
3.84 µs ± 151 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
5.33 µs ± 200 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

 

참고

O'REILLY 제이크 밴더플래스 저/ 위키북스 김정인 역 - 파이썬 데이터 사이언스 핸드북

Comments