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 long integers, поскольку обычный целочисленный тип Python не может охватить весь диапазон беззнаковых (long) целых чисел в C.
Модуль определяет следующий тип:
- class array.array(typecode[, initializer])¶
Новый массив, элементы которого ограничены кодом типа typecode и инициализируются из необязательного значения initializer, которое должно быть списком, строкой или итерируемым объектом, содержащим элементы подходящего типа.
Изменено в версии 2.4: Ранее принимались только списки или строки.
Если передан список или строка, инициализатор передаётся методу fromlist(), fromstring() или fromunicode() нового массива (см. ниже) для добавления начальных элементов. В противном случае итерируемый инициализатор передаётся методу extend().
Объекты 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++ (единственный способ эффективно использовать эту информацию), более разумно использовать буферный интерфейс, поддерживаемый объектами массива. Этот метод сохраняется для обратной совместимости и не должен использоваться в новом коде. Буферный интерфейс описан в Buffer Objects.
- array.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) определяет другой тип массива; см. http://numpy.sourceforge.net/ для получения дополнительной информации о Numerical Python. (PDF-версия руководства NumPy доступна по адресу http://numpy.sourceforge.net/numdoc/numdoc.pdf).