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

array — 숫자 값의 효율적인 배열 (Efficient arrays of numeric values)

이 모듈은 문자, 정수, 부동소수점 숫자 같은 기본 값들의 배열을 압축적으로 표현할 수 있는 객체 타입을 정의해요. 배열은 가변 시퀀스 타입이고 리스트와 매우 비슷하게 동작하지만, 저장되는 객체의 타입이 제한된다는 점이 달라요.

출처: Python 표준 라이브러리

본문

이 모듈은 문자, 정수, 부동소수점 숫자 같은 기본 값들의 배열을 압축적으로 나타낼 수 있는 객체 타입을 정의해요. 배열은 가변 시퀀스 타입이고 리스트와 매우 비슷하게 동작해요. 다만 배열 안에 저장되는 객체의 타입이 제한된다는 점이 다르죠. 타입은 객체 생성 시점에 typecode(단일 문자)를 지정해서 정해요.

정의된 typecode는 이래요.

  • 'b' — C 타입 signed char, Python 타입 int, 최소 크기 1바이트
  • 'B'unsigned char, int, 1
  • 'u'wchar_t, Unicode 문자, 2 — (1)
  • 'w'Py_UCS4, Unicode 문자, 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')는 이제 폐기된 Py_UNICODE 대신 C 타입으로 wchar_t를 사용해요. Py_UNICODE는 Python 3.3부터 wchar_t의 별칭이므로 동작에는 영향이 없어요. 3.3부터 폐기, 3.16 버전에서 제거될 예정: 'w' typecode로 마이그레이션하세요.
  • (2) 3.13 버전에서 추가.

더 알아보기: ctypesstruct 모듈, 그리고 numpy 같은 서드파티 모듈도 비슷하지만 살짝 다른 typecode를 사용해요.

값의 실제 표현은 머신 아키텍처(엄밀히는 C 구현)에 의해 결정돼요. 실제 크기는 array.itemsize 속성으로 접근할 수 있어요.

array.typecodes

사용 가능한 모든 typecode를 담은 문자열이에요.

class array.array(typecode[, initializer])

아이템이 typecode로 제한되는 새 배열이에요. 선택적 initializer 값(바이트나 bytearray 객체, Unicode 문자열, 또는 적절한 타입의 요소에 대한 iterable)으로 초기화돼요.

  • bytesbytearray 객체가 주어지면 initializer는 새 배열의 frombytes() 메서드로 전달돼요.
  • Unicode 문자열이 주어지면 initializer는 fromunicode() 메서드로 전달돼요.
  • 그 외에는 initializer의 iterator가 extend() 메서드로 전달돼 초기 아이템이 배열에 추가돼요.

배열 객체는 인덱싱, 슬라이싱, 연결, 곱셈 같은 일반적인 가변 시퀀스 연산을 지원해요. 슬라이스 할당을 쓸 때는 할당되는 값이 같은 typecode의 배열 객체여야 해요. 그 외의 경우에는 TypeError가 발생해요. 배열 객체는 버퍼 인터페이스도 구현하므로, bytes-like 객체가 지원되는 어디서든 사용할 수 있어요. 배열은 내용의 타입에 대해 generic이에요.

array.__new__ 감사 이벤트를 인자 typecode, initializer로 발생시켜요.

typecode

배열을 만드는 데 사용된 typecode 문자예요.

itemsize

내부 표현에서 배열 아이템 하나의 바이트 길이예요.

append(value, /)

지정된 값을 가진 새 아이템을 배열 끝에 추가해요.

buffer_info()

배열의 내용을 담는 버퍼의 현재 메모리 주소와 요소 길이를 주는 튜플 (address, length)를 반환해요. 메모리 버퍼의 바이트 크기는 array.buffer_info()[1] * array.itemsize로 계산할 수 있어요. 메모리 주소를 요구하는 저수준(본질적으로 안전하지 않은) I/O 인터페이스, 예를 들어 특정 ioctl() 연산과 함께 작업할 때 가끔 유용해요. 반환된 숫자는 배열이 존재하고 길이를 바꾸는 연산이 적용되지 않는 한 유효해요.

참고: C나 C++로 작성된 코드에서 배열 객체를 쓸 때(이 정보를 효과적으로 활용하는 유일한 방법)는 배열 객체가 지원하는 버퍼 인터페이스를 쓰는 게 더 합리적이에요. 이 메서드는 하위 호환성을 위해 유지되며 새 코드에서는 피해야 해요. 버퍼 인터페이스는 Buffer Protocol 문서에 설명돼 있어요.

byteswap()

배열의 모든 아이템을 "byteswap"해요. 크기가 1, 2, 4, 8바이트인 값에서만 지원되고, 다른 타입의 값이면 RuntimeError가 발생해요. 다른 바이트 순서를 가진 머신에서 쓰인 파일에서 데이터를 읽을 때 유용해요.

count(value, /)

배열에서 value가 나타난 횟수를 반환해요.

extend(iterable, /)

iterable에서 배열 끝으로 아이템을 추가해요. iterable이 다른 배열이면 정확히 같은 typecode여야 해요. 아니면 TypeError가 발생해요. iterable이 배열이 아니면 iterable이어야 하고, 그 요소들은 배열에 추가되기 위한 올바른 타입이어야 해요.

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, /)

주어진 Unicode 문자열의 데이터로 배열을 확장해요. 배열의 typecode가 'u''w'여야 해요. 아니면 ValueError가 발생해요. 다른 타입의 배열에 Unicode 데이터를 추가하려면 array.frombytes(unicodestring.encode(enc))를 사용하세요.

index(value[, start[, stop]])

배열에서 value가 처음 나타나는 인덱스 i인 가장 작은 i를 반환해요. 선택적 startstop을 지정해 배열의 일부분 안에서 value를 검색할 수 있어요. value가 없으면 ValueError를 발생시켜요.

3.10 버전 변경: 선택적 startstop 매개변수 추가.

insert(index, value, /)

위치 index 앞에 새 아이템 value를 배열에 삽입해요. 음수 값은 배열의 끝에 상대적인 것으로 취급돼요.

pop(index=-1, /)

인덱스 i의 아이템을 배열에서 제거하고 반환해요. 선택적 인자의 기본값은 -1이라 기본적으로 마지막 아이템을 제거하고 반환해요.

remove(value, /)

배열에서 value의 첫 번째 출현을 제거해요.

clear()

배열에서 모든 요소를 제거해요.

3.13 버전에서 추가.

reverse()

배열 아이템의 순서를 뒤집어요.

tobytes()

배열을 머신 값의 배열로 변환하고 바이트 표현을 반환해요(tofile() 메서드가 파일에 쓰는 것과 같은 바이트 시퀀스).

3.2 버전에서 추가: 명확성을 위해 tostring()tobytes()로 이름이 바뀌었어요.

tofile(f, /)

모든 아이템(머신 값으로)을 파일 객체 f에 써요.

tolist()

같은 아이템을 가진 일반 리스트로 배열을 변환해요.

tounicode()

배열을 Unicode 문자열로 변환해요. 배열의 타입이 'u''w'여야 해요. 아니면 ValueError가 발생해요. 다른 타입의 배열에서 Unicode 문자열을 얻으려면 array.tobytes().decode(enc)를 사용하세요.

배열 객체의 문자열 표현은 array(typecode, initializer) 형태예요. 배열이 비어 있으면 initializer는 생략되고, 아니면 typecode가 'u''w'면 Unicode 문자열, 그 외에는 숫자 리스트예요. from array import array로 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])

더 알아보기

  • Module struct — 이질적인 이진 데이터의 패킹·언패킹.
  • NumPy — NumPy 패키지는 또 다른 배열 타입을 정의해요.