Документация Python неофициальный перевод

8.6. array – Эффективные массивы числовых значенийarray – Efficient arrays of numeric values

Этот модуль определяет тип объекта, который может компактно представлять массив базовых значений: символы, целые числа, числа с плавающей запятой. Массивы являются последовательностями и ведут себя очень похоже на списки, за исключением того, что тип хранимых в них объектов ограничен. Тип задаётся при создании объекта с помощью кода типа, который представляет собой один символ. Определены следующие коды типа:

Код типа

Тип C

Тип Python

Минимальный размер в байтах

'c'

char

символ

1

'b'

знаковый char

int

1

'B'

беззнаковый char

int

1

'u'

Py_UNICODE

символ Unicode

2 (см. примечание)

'h'

знаковый short

int

2

'H'

беззнаковый short

int

2

'i'

знаковый int

int

2

'I'

беззнаковый int

long

2

'l'

знаковый long

int

4

'L'

беззнаковый long

long

4

'f'

float

float

4

'd'

double

float

8

Примечание

Код типа 'u' соответствует символу Unicode в Python. В узкой сборке Unicode он занимает 2 байта, в широкой – 4 байта.

Фактическое представление значений определяется архитектурой машины (строго говоря, реализацией на C). Реальный размер можно получить через атрибут itemsize. Значения, хранящиеся для элементов 'L' и 'I', при извлечении будут представлены как длинные целые числа Python, поскольку обычный целочисленный тип Python не может охватить весь диапазон беззнаковых (длинных) целых чисел C.

Модуль определяет следующий тип:

class array.array(typecode[, initializer])

Новый массив, элементы которого ограничены кодом типа typecode и инициализируются из необязательного значения initializer, которое должно быть списком, строкой или итерируемым объектом, содержащим элементы подходящего типа.

Изменено в версии 2.4: Ранее принимались только списки или строки.

Если указан список или строка, инициализатор передается методу fromlist(), fromstring() или fromunicode() нового массива (см. ниже) для добавления начальных элементов в массив. В противном случае итерируемый инициализатор передается методу extend().

array.ArrayType

Устаревший псевдоним для array.

Объекты массивов поддерживают обычные операции последовательностей: индексирование, срезы, конкатенацию и умножение. При использовании присваивания срезу присваиваемое значение должно быть объектом массива с тем же кодом типа; во всех остальных случаях возбуждается TypeError. Объекты массивов также реализуют буферный интерфейс и могут использоваться везде, где поддерживаются буферные объекты.

Также поддерживаются следующие элементы данных и методы:

array.typecode

Символ кода типа, использованный для создания массива.

array.itemsize

Длина в байтах одного элемента массива во внутреннем представлении.

array.append(x)

Добавляет новый элемент со значением x в конец массива.

array.buffer_info()

Возвращает кортеж (address, length), содержащий текущий адрес памяти и длину в элементах буфера, используемого для хранения содержимого массива. Размер буфера памяти в байтах можно вычислить как array.buffer_info()[1] * array.itemsize. Это иногда полезно при работе с низкоуровневыми (и по своей природе небезопасными) интерфейсами ввода-вывода, требующими адреса памяти, такими как некоторые операции ioctl(). Возвращаемые числа действительны, пока существует массив и к нему не применяются операции, изменяющие длину.

Примечание

При использовании объектов массивов из кода на C или C++ (единственный способ эффективно использовать эту информацию) имеет больше смысла применять буферный интерфейс, поддерживаемый объектами массивов. Этот метод сохраняется для обратной совместимости, и его следует избегать в новом коде. Буферный интерфейс описан в Buffers and Memoryview Objects.

array.byteswap()

“Byteswap” все элементы массива. Поддерживается только для значений размером 1, 2, 4 или 8 байт; для значений других типов вызывается исключение RuntimeError. Полезно при чтении данных из файла, созданного на машине с другим порядком байт.

array.count(x)

Возвращает количество вхождений x в массиве.

array.extend(iterable)

Добавляет элементы из iterable в конец массива. Если iterable – другой массив, он должен иметь точно такой же код типа; в противном случае будет возбуждено TypeError. Если iterable не является массивом, он должен быть итерируемым, а его элементы должны быть подходящего типа для добавления в массив.

Изменено в версии 2.4: Ранее аргументом мог быть только другой массив.

array.fromfile(f, n)

Читает n элементов (как машинные значения) из файлового объекта f и добавляет их в конец массива. Если доступно менее n элементов, возбуждается EOFError, но доступные элементы всё равно вставляются в массив. f должен быть настоящим встроенным файловым объектом; что-то другое с методом read() не подойдёт.

array.fromlist(list)

Добавляет элементы из списка. Эквивалентно for x in list: a.append(x), за исключением того, что в случае ошибки типа массив остаётся неизменным.

array.fromstring(s)

Добавляет элементы из строки, интерпретируя строку как машинный массив значений (как если бы он был прочитан из файла с помощью метода fromfile()).

array.fromunicode(s)

Расширяет этот массив данными из заданной строки Unicode. Массив должен быть типа 'u'; в противном случае возникает ValueError. Используйте array.fromstring(unicodestring.encode(enc)) для добавления данных Unicode в массив другого типа.

array.index(x)

Возвращает наименьшее i, такое, что i является индексом первого вхождения x в массиве.

array.insert(i, x)

Вставляет новый элемент со значением x в массив перед позицией i. Отрицательные значения интерпретируются как смещение от конца массива.

array.pop([i])

Удаляет элемент с индексом i из массива и возвращает его. Необязательный аргумент по умолчанию равен -1, так что по умолчанию удаляется и возвращается последний элемент.

array.read(f, n)

Устарело с версии 1.5.1: Используйте метод fromfile().

Читает n элементов (как машинные значения) из файлового объекта f и добавляет их в конец массива. Если доступно менее n элементов, возбуждается EOFError, но доступные элементы всё равно вставляются в массив. f должен быть настоящим встроенным файловым объектом; что-то другое с методом read() не подойдёт.

array.remove(x)

Удаляет первое вхождение x из массива.

array.reverse()

Изменяет порядок элементов в массиве на обратный.

array.tofile(f)

Записывает все элементы (в машинном представлении) в файловый объект f.

array.tolist()

Преобразует массив в обычный список с теми же элементами.

array.tostring()

Преобразует массив в массив машинных значений и возвращает строковое представление (ту же последовательность байтов, которая была бы записана в файл методом tofile()).

array.tounicode()

Преобразует массив в строку Unicode. Массив должен быть типа 'u'; в противном случае возникает ValueError. Используйте array.tostring().decode(enc) для получения строки Unicode из массива другого типа.

array.write(f)

Устарело с версии 1.5.1: Используйте метод tofile().

Записывает все элементы (в машинном представлении) в файловый объект f.

Когда объект массива выводится или преобразуется в строку, он представляется как array(typecode, initializer). Параметр initializer опускается, если массив пуст, в противном случае это строка, если typecode равен 'c', иначе это список чисел. Строка гарантированно может быть преобразована обратно в массив с тем же типом и значением с помощью eval(), при условии, что класс array был импортирован с помощью from array import array. Примеры:

array('l')
array('c', 'hello world')
array('u', u'hello \u2641')
array('l', [1, 2, 3, 4, 5])
array('d', [1.0, 2.0, 3.14])

См. также

Модуль struct

Упаковка и распаковка разнородных двоичных данных.

Модуль xdrlib

Упаковка и распаковка данных внешнего представления (XDR), используемого в некоторых системах удалённого вызова процедур.

Документация Numerical Python

Расширение Numeric Python (NumPy) определяет ещё один тип массива; дополнительную информацию о Numerical Python см. на http://www.numpy.org/.