Python/Numpy

[Numpy] 레코드 배열 recarray 자료형 선언 및 사용 방법

jimmy_AI 2022. 12. 9. 12:33
반응형

파이썬 넘파이 recarray type

파이썬의 numpy 모듈에서 제공하는 자료형인 레코드 배열(recarray)의

선언 방법을 위주로 사용 방법을 간략하게 정리해보도록 하겠습니다.

 

참고로, 레코드 배열에서는 arr['x'] = [1, 3] 처럼 attributes로 해당되는

부분 배열을 가져오는 기능을 제공합니다.

(이는 마치 판다스에서 열을 추출하는 원리와 비슷합니다.)

 

해당 글은 아래 링크의 넘파이 공식 문서를 참고하여 작성되었으며,

더 자세한 내용이 궁금하시다면 해당 글을 참고해주세요.

 

numpy.recarray — NumPy v1.23 Manual

A list containing the data-types for the different columns, e.g. ['i4', 'f8', 'i4']. formats does not support the new convention of using types directly, i.e. (int, float, int). Note that formats must be a list, not a tuple. Given that formats is somewhat

numpy.org

 

 

1. np.array로 선언 방법

먼저, 일반적인 넘파이 배열을 선언하는 메소드인 np.array로도 recarray와

유사한 자료형을 쉽게 선언할 수 있습니다.

 

dtype 인자에 ('조회할 속성 이름', '자료형')을 순서대로 지정해주시면 되며,

자료형은 int, float나 혹은 <i4, <f8 처럼 넘파이 숫자 자료형을 지정할 수도 있습니다.

 

다음은 x, y, z의 세 가지 attributes를 가지는 recarray를 선언한 예시입니다.

import numpy as np

x = np.array([(1, 2.5, 4), (3, 5.5, 8)], dtype=[('x', 'int'), ('y', 'float'), ('z', '<i4')])

 

값 조회 및 재할당은 아래와 같이 딕셔너리와 유사하게 진행이 가능합니다.

(값 할당 시 자료형은 dtype에서 선언했던 자료형으로 자동 변환됩니다.)

x['x'] # array([1, 3])
x['y'] # array([2.5, 5.5])
x['z'] # array([4, 8], dtype=int32)

x['z'] = [10, 20]
x['z'] # array([10, 20], dtype=int32)

 

다만, 이 형태로 선언 시에는 x.x 형태로 값에 접근하는 것은 불가능합니다.

x.x # AttributeError: 'numpy.ndarray' object has no attribute 'x'

 

반응형

 

여기서, view 메소드로 완전한 recarray 자료형 변환이 가능합니다.

x = x.view(np.recarray)

 

이제, x['x'], x.x 형태 모두로 값에 접근이 가능합니다.

x.x # array([1, 3])
x['x'] # array([1, 3])

 

 

2. np.recarray로 선언 방법

처음부터 np.recarray 메소드를 활용하여 레코드 배열을 바로 선언하는 것도 가능합니다.

 

위의 예제 x와 같은 형태, 속성 및 자료형의 recarray인 y 선언 예시는 다음과 같습니다.

y = np.recarray((2,),
dtype=[('x', 'int'), ('y', 'float'), ('z', '<i4')])

 

이렇게 선언한 경우 값은 임의의 값으로 할당되어 있는 상태입니다.

y['x'], y.x 형태 모두로 값에 접근이 가능합니다.

y['x'] # array([57007904,        0])
y['y'] # array([0., 0.])
y['z'] # array([0, 0], dtype=int32)

y.x # array([57007904,        0])

 

값 수정이 자유롭기에 각 속성에 값을 할당하여 사용해주시면 됩니다.

y['x'] = [1, 3]
y['x'] # array([1, 3])