array — 숫자 값의 효율적인 배열

array — 숫자 값의 효율적인 배열

이 모듈은 문자, 정수, 부동소수점 수 같은 기본 값들의 배열을 컴팩트하게 표현하는 객체 타입을 정의해요. 배열은 가변 시퀀스 타입이고 리스트와 매우 비슷하게 동작하지만, 저장되는 객체의 타입이 제한된다는 점이 달라요. 타입은 객체 생성 시 타입 코드(type code) 라는 한 글자로 지정해요. 정의된 타입 코드는 다음과 같아요.

Type code C Type Python Type 최소 크기(바이트) Notes
'b' signed char int 1
'B' unsigned char int 1
'u' wchar_t Unicode character 2 (1)
'w' Py_UCS4 Unicode character 4 (2)
'h' signed short int 2
'H' unsigned short int 2
'i' signed int int 2
'I' unsigned int int 2
'l' signed long int 4
'L' unsigned long int 4
'q' signed long long int 8
'Q' unsigned long long int 8
'f' float float 4
'd' double float 8

참고:

  • (1) 플랫폼에 따라 16비트 또는 32비트일 수 있어요. 3.9부터 array('u')는 deprecated된 Py_UNICODE 대신 wchar_t를 C 타입으로 사용해요. 3.3부터, 3.16에서 제거 예정: 'w' 타입 코드로 마이그레이션하세요.
  • (2) 3.13 추가.

ctypesstruct 모듈, 그리고 numpy 같은 서드파티 모듈도 비슷하지만 약간 다른 타입 코드를 사용해요. 값의 실제 표현은 머신 아키텍처(정확히는 C 구현)에 의해 결정되고, 실제 크기는 array.itemsize 속성으로 접근할 수 있어요.

출처: Python documentation

본문

모듈 항목

  • array.typecodes: 사용 가능한 모든 타입 코드를 담은 문자열이에요.

class array.array(typecode[, initializer])

항목이 typecode로 제한되는 새 배열이에요. 선택적 initializerbytes 또는 bytearray 객체, 유니코드 문자열, 또는 적절한 타입의 요소를 반복하는 iterable이어야 해요.

  • bytes/bytearray 객체면 frombytes() 메서드로 전달되고,
  • 유니코드 문자열이면 fromunicode() 메서드로 전달되며,
  • 그 외에는 initializer의 iterator가 extend() 메서드로 전달돼 초기 항목을 추가해요.

배열 객체는 인덱싱, 슬라이싱, 결합, 곱셈 같은 일반적인 가변 시퀀스 연산을 지원해요. 슬라이스 할당을 쓸 때는 할당값이 같은 타입 코드의 배열 객체여야 해요. 그 외 모든 경우에는 TypeError가 발생해요. 배열 객체는 버퍼 인터페이스도 구현해서 bytes-like 객체가 지원되는 곳 어디든 사용할 수 있어요. 배열은 내용의 타입에 대해 제네릭이에요. 감사 이벤트 array.__new__를 typecode, initializer 인자로 발생시켜요.

속성과 메서드

  • typecode: 배열 생성에 사용된 타입 코드 문자.
  • itemsize: 내부 표현에서 배열 항목 하나의 바이트 길이.
  • append(value, /): 배열 끝에 지정값의 새 항목을 추가.
  • buffer_info(): 현재 메모리 주소와 배열 내용을 담는 버퍼의 요소 수(length)인 (address, length) 튜플을 반환. 메모리 버퍼 크기(바이트)는 array.buffer_info()[1] * array.itemsize로 계산. 메모리 주소가 필요한 저수준(본질적으로 안전하지 않은) I/O 인터페이스(예: 일부 ioctl() 연산)에서 가끔 유용. 배열이 존재하고 길이 변경 연산이 적용되지 않는 동안 반환된 숫자는 유효. C/C++ 코드에서 쓸 때는 buffer 인터페이스를 쓰는 게 더 낫고, 이 메서드는 하위 호환을 위해 유지되므로 새 코드에선 피하는 게 좋아.
  • byteswap(): 배열의 모든 항목을 "byteswap"해요. 크기가 1, 2, 4, 8바이트인 값에서만 지원되고, 다른 타입은 RuntimeError. 바이트 순서가 다른 머신에서 쓴 파일을 읽을 때 유용.
  • count(value, /): 배열에서 value의 발생 횟수 반환.
  • extend(iterable, /): iterable의 항목을 배열 끝에 추가. iterable이 다른 배열이면 정확히 같은 타입 코드여야 하고, 아니면 TypeError.
  • frombytes(buffer, /): bytes-like 객체의 내용을 머신 값 배열로 해석해 항목을 추가 (마치 fromfile()로 파일에서 읽은 것처럼). (3.2에서 fromstring()이 frombytes()로 이름 변경)
  • fromfile(f, n, /): 파일 객체 f에서 n개 항목(머신 값으로)을 읽어 배열 끝에 추가. n개 미만이면 EOFError가 발생하지만, 사용 가능했던 항목은 여전히 삽입돼요.
  • fromlist(list, /): 리스트에서 항목 추가. for x in list: a.append(x)와 동등하지만 타입 오류 시 배열이 변하지 않는 게 다름.
  • fromunicode(ustr, /): 주어진 유니코드 문자열의 데이터로 배열 확장. 배열 타입 코드가 'u' 또는 'w'여야 하고, 아니면 ValueError. 다른 타입의 배열에 유니코드 데이터를 추가하려면 array.frombytes(unicodestring.encode(enc)) 사용.
  • index(value[, start[, stop]]): 배열에서 value의 첫 발생 인덱스인 가장 작은 i를 반환. start/stop으로 부분 검색 가능. 못 찾으면 ValueError. (3.10에서 start/stop 추가)
  • insert(index, value, /): 위치 index 앞에 새 항목 value를 삽입. 음수는 배열 끝 기준.
  • pop(index=-1, /): 인덱스 i의 항목을 제거하고 반환. 기본값 -1로 마지막 항목을 제거·반환.
  • remove(value, /): value의 첫 발생 제거.
  • clear(): 배열의 모든 요소 제거. (3.13 추가)
  • reverse(): 배열 항목 순서 뒤집기.
  • tobytes(): 배열을 머신 값 배열로 변환하고 bytes 표현 반환 (tofile()이 파일에 쓰는 것과 같은 바이트 시퀀스). (3.2에서 tostring()이 tobytes()로 이름 변경)
  • tofile(f, /): 모든 항목(머신 값으로)을 파일 객체 f에 쓰기.
  • tolist(): 같은 항목을 가진 일반 리스트로 변환.
  • tounicode(): 배열을 유니코드 문자열로 변환. 타입이 'u' 또는 'w'여야 하고 아니면 ValueError. 다른 타입에선 array.tobytes().decode(enc) 사용.

문자열 표현

배열 객체의 문자열 표현은 array(typecode, initializer) 형태예요. initializer는 배열이 비어 있으면 생략되고, typecode가 'u'/'w'면 유니코드 문자열, 아니면 숫자 리스트예요. 이 문자열 표현은 from array import array로 클래스를 import했다면 eval()로 같은 타입·값의 배열로 되돌릴 수 있다는 게 보장돼요. 부동소수점 값이 있으면 infnan 변수도 정의되어야 해요.

array('l')
array('w', 'hello \u2641')
array('l', [1, 2, 3, 4, 5])
array('d', [1.0, 2.0, 3.14, -inf, nan])

참고: struct 모듈(이질적 바이너리 데이터의 패킹/언패킹)과 NumPy(또 다른 배열 타입 정의)도 함께 보세요.

더 알아보기 (Learn more)