8.6. array – Эффективные массивы числовых значений¶array – Efficient arrays of numeric values
Этот модуль определяет тип объекта, который может компактно представлять массив базовых значений: символы, целые числа, числа с плавающей запятой. Массивы являются последовательностями и ведут себя очень похоже на списки, за исключением того, что тип хранимых в них объектов ограничен. Тип задаётся при создании объекта с помощью кода типа, который представляет собой один символ. Определены следующие коды типа:
Код типа |
Тип C |
Тип Python |
Минимальный размер в байтах |
|---|---|---|---|
|
char |
символ |
1 |
|
знаковый char |
int |
1 |
|
беззнаковый char |
int |
1 |
|
Py_UNICODE |
символ Unicode |
2 (см. примечание) |
|
знаковый short |
int |
2 |
|
беззнаковый short |
int |
2 |
|
знаковый int |
int |
2 |
|
беззнаковый int |
long |
2 |
|
знаковый long |
int |
4 |
|
беззнаковый long |
long |
4 |
|
float |
float |
4 |
|
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().
Объекты массивов поддерживают обычные операции последовательностей: индексирование, срезы, конкатенацию и умножение. При использовании присваивания срезу присваиваемое значение должно быть объектом массива с тем же кодом типа; во всех остальных случаях возбуждается 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/.