8.6. array – Эффективные массивы числовых значений¶array – Efficient arrays of numeric values
Этот модуль определяет тип объекта, который может компактно представлять массив базовых значений: символы, целые числа, числа с плавающей запятой. Массивы являются последовательностями и ведут себя очень похоже на списки, за исключением того, что тип хранимых в них объектов ограничен. Тип задаётся при создании объекта с помощью кода типа, который представляет собой один символ. Определены следующие коды типа:
| Код типа | Тип C | Тип Python | Минимальный размер в байтах |
|---|---|---|---|
| '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 | int | 2 |
| 'l' | знаковый long | int | 4 |
| 'L' | беззнаковый long | int | 4 |
| 'f' | float | float | 4 |
| 'd' | double | float | 8 |
Примечание
Типовой код 'u' соответствует символу Unicode в Python. В узких сборках Unicode он занимает 2 байта, в широких – 4 байта.
Фактическое представление значений определяется архитектурой машины (строго говоря, реализацией на C). Реальный размер можно получить через атрибут itemsize.
Модуль определяет следующий тип:
- class array.array(typecode[, initializer])¶
Новый массив, элементы которого ограничены типовым кодом, и инициализируется из необязательного значения инициализатора, которое должно быть списком, объектом, поддерживающим интерфейс буфера, или итерируемым объектом, содержащим элементы подходящего типа.
Если передан список или строка, инициализатор передаётся методу fromlist(), fromstring() или fromunicode() нового массива (см. ниже) для добавления начальных элементов. В противном случае итерируемый инициализатор передаётся методу extend().
- array.typecodes¶
- Строка со всеми доступными кодами типов.
Объекты array поддерживают обычные операции последовательностей: индексацию, срезы, конкатенацию и умножение. При использовании присваивания срезу присваиваемое значение должно быть объектом array с тем же кодом типа; во всех остальных случаях возбуждается TypeError. Объекты array также реализуют интерфейс буфера и могут использоваться везде, где поддерживаются буферные объекты.
Также поддерживаются следующие элементы данных и методы:
- array.typecode¶
- Символ кода типа, использованный для создания массива.
- array.itemsize¶
- Длина в байтах одного элемента массива во внутреннем представлении.
- array.append(x)¶
- Добавляет новый элемент со значением x в конец массива.
- array.buffer_info()¶
Возвращает кортеж (address, length), содержащий текущий адрес памяти и количество элементов в буфере, используемом для хранения содержимого массива. Размер буфера памяти в байтах можно вычислить как array.buffer_info()[1] * array.itemsize. Это иногда полезно при работе с низкоуровневыми (и по своей сути небезопасными) интерфейсами ввода-вывода, требующими адреса памяти, такими как некоторые операции ioctl(). Возвращаемые числа действительны до тех пор, пока массив существует и к нему не применяются операции, изменяющие длину.
Примечание
При использовании объектов массива из кода, написанного на C или C++ (единственный способ эффективно использовать эту информацию), более разумно использовать буферный интерфейс, поддерживаемый объектами массива. Этот метод сохраняется для обратной совместимости, и его следует избегать в новом коде. Буферный интерфейс описан в Протоколе буфера.
- array.byteswap()¶
- «Байт-своп» (перестановка байтов) всех элементов массива. Это поддерживается только для значений размером 1, 2, 4 или 8 байт; для значений других типов возбуждается RuntimeError. Это полезно при чтении данных из файла, записанного на машине с другим порядком байтов.
- array.count(x)¶
- Возвращает количество вхождений x в массиве.
- array.extend(iterable)¶
- Добавляет элементы из iterable в конец массива. Если iterable является другим массивом, он должен иметь точно такой же типовой код; в противном случае будет возбуждено TypeError. Если iterable не является массивом, он должен быть итерируемым, а его элементы должны быть подходящего типа для добавления в массив.
- 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.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(typecode, initializer). Параметр initializer опускается, если массив пуст; в противном случае это строка, если typecode равен 'u', иначе это список чисел. Гарантируется, что строку можно преобразовать обратно в массив с тем же типом и значением с помощью eval() при условии, что функция array() была импортирована через from array import array. Примеры:
array('l')
array('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) определяет другой тип массива; см. http://numpy.sourceforge.net/ для получения дополнительной информации о Numerical Python. (PDF-версия руководства NumPy доступна по адресу http://numpy.sourceforge.net/numdoc/numdoc.pdf).