8.7. array – Эффективные массивы числовых значений¶array – Efficient arrays of numeric values
Этот модуль определяет тип объекта, который может компактно представлять массив базовых значений: символы, целые числа, числа с плавающей запятой. Массивы являются последовательностями и ведут себя очень похоже на списки, за исключением того, что тип хранимых в них объектов ограничен. Тип задаётся при создании объекта с помощью кода типа, который представляет собой один символ. Определены следующие коды типа:
| Код типа | Тип C | Тип Python | Минимальный размер в байтах | Примечания |
|---|---|---|---|---|
'b' |
signed char | int | 1 | |
'B' |
unsigned char | int | 1 | |
'u' |
Py_UNICODE | символ Unicode | 2 | (1) |
'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 | (2) |
'Q' |
unsigned long long | int | 8 | (2) |
'f' |
float | float | 4 | |
'd' |
double | float | 8 |
Примечания:
Код типа
'u'соответствует устаревшему символу Unicode в Python (Py_UNICODE, который являетсяwchar_t). В зависимости от платформы он может быть 16-битным или 32-битным.'u'будет удалён вместе с остальной частью APIPy_UNICODE.Устарело с версии 3.3, будет удалено в версии 4.0.
Коды типов
'q'и'Q'доступны только в том случае, если компилятор C платформы, используемый для сборки Python, поддерживает Clong long, или, на Windows,__int64.Новое в версии 3.3.
Фактическое представление значений определяется архитектурой машины (строго говоря, реализацией C). Фактический размер можно получить через атрибут itemsize.
Модуль определяет следующий тип:
-
class
array.array(typecode[, initializer])¶ Новый массив, элементы которого ограничены typecode, и инициализируется из необязательного значения initializer, которое должно быть списком, байтоподобным объектом или итерируемым по элементам соответствующего типа.
Если указан список или строка, инициализатор передается методу
fromlist(),frombytes()или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()¶ “Byteswap” все элементы массива. Поддерживается только для значений размером 1, 2, 4 или 8 байт; для значений других типов вызывается исключение
RuntimeError. Полезно при чтении данных из файла, созданного на машине с другим порядком байт.
-
array.count(x)¶ Возвращает количество вхождений x в массиве.
-
array.extend(iterable)¶ Добавляет элементы из iterable в конец массива. Если iterable – другой массив, он должен иметь точно такой же код типа; в противном случае будет возбуждено
TypeError. Если iterable не является массивом, он должен быть итерируемым, а его элементы должны быть подходящего типа для добавления в массив.
-
array.frombytes(s)¶ Добавляет элементы из строки, интерпретируя строку как машинный массив значений (как если бы он был прочитан из файла с помощью метода
fromfile()).Новое в версии 3.2:
fromstring()переименован вfrombytes()для ясности.
-
array.fromfile(f, n)¶ Читает n элементов (как машинные значения) из файлового объекта f и добавляет их в конец массива. Если доступно менее n элементов, возбуждается
EOFError, но доступные элементы всё равно вставляются в массив. f должен быть настоящим встроенным файловым объектом; что-либо ещё с методомread()не подойдёт.
-
array.fromlist(list)¶ Добавляет элементы из списка. Эквивалентно
for x in list: a.append(x), за исключением того, что в случае ошибки типа массив остаётся неизменным.
-
array.fromstring()¶ Устаревший псевдоним для
frombytes().
-
array.fromunicode(s)¶ Расширяет этот массив данными из заданной строки Unicode. Массив должен быть типа
'u'; в противном случае возникаетValueError. Используйтеarray.frombytes(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.tobytes()¶ Преобразует массив в машинные значения и возвращает байтовое представление (ту же последовательность байтов, которая была бы записана в файл методом
tofile()).Новое в версии 3.2:
tostring()переименован вtobytes()для ясности.
-
array.tofile(f)¶ Записывает все элементы (как машинные значения) в файловый объект f.
-
array.tolist()¶ Преобразует массив в обычный список с теми же элементами.
-
array.tounicode()¶ Преобразует массив в строку Unicode. Массив должен быть типа
'u'; в противном случае возникаетValueError. Используйтеarray.tobytes().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) определяет ещё один тип массива; дополнительную информацию о Numerical Python см. на http://www.numpy.org/.