Array.array: примеры (PYTHON)

Работа с типизированными массивами через array.array в Python
Раздел: Массивы, Структуры данных
array.array(typecode: str, initializer: iterable): array object

Основные сведения о функции array.array

Функция array.array() из модуля array создает объект массива, который хранит однородные данные одного типа в более компактной форме по сравнению с обычными списками. Использование массива эффективно при работе с большими объемами числовых данных, где важна экономия памяти и производительность.

Синтаксис функции: array.array(typecode[, initializer])

Параметры:

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

Возвращаемое значение - объект массива типа array.array, поддерживающий основные операции последовательностей: индексацию, срезы, конкатенацию, повторение.

Основные типовые коды:

  • 'b' - знаковое целое (1 байт)
  • 'B' - беззнаковое целое (1 байт)
  • 'h' - знаковое короткое целое (2 байта)
  • 'i' - знаковое целое (2 или 4 байта)
  • 'l' - знаковое длинное целое (4 байта)
  • 'f' - вещественное одинарной точности (4 байта)
  • 'd' - вещественное двойной точности (8 байта)

Базовые примеры использования array.array

Создание массива целых чисел:

import array

arr1 = array.array('i', [1, 2, 3, 4, 5])
print(arr1)
array('i', [1, 2, 3, 4, 5])

Создание массива вещественных чисел:

arr2 = array.array('f', [1.5, 2.7, 3.0])
print(arr2)
array('f', [1.5, 2.700000047683716, 3.0])

Инициализация массива из строки байтов:

arr3 = array.array('b', b'Hello')
print(arr3)
array('b', [72, 101, 108, 108, 111])

Создание пустого массива с последующим добавлением элементов:

arr4 = array.array('d')
arr4.append(3.14)
arr4.extend([2.71, 1.41])
print(arr4)
array('d', [3.14, 2.71, 1.41])

Альтернативные структуры данных в Python

В Python существуют несколько структур данных, которые могут использоваться вместо array.array:

  • list - стандартный список Python. Более гибкий, может содержать элементы разных типов, но занимает больше памяти. Предпочтительнее для общего использования, когда тип данных неоднороден или нужны различные методы работы с коллекциями.
  • numpy.ndarray - массив из библиотеки NumPy. Обеспечивает высокую производительность для числовых операций, поддерживает многомерные массивы и векторные операции. Используется в научных вычислениях и анализе данных.
  • collections.deque - двусторонняя очередь. Оптимизирована для быстрых операций добавления/удаления с обоих концов. Подходит для реализации очередей и стеков.
  • bytearray - изменяемая последовательность байтов. Специализирована для работы с бинарными данными.

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

Аналоги array.array в других языках программирования

PHP - функция array():

$arr = array(1, 2, 3, 4, 5);
print_r($arr);
Array
(
    [0] => 1
    [1] => 2
    [2] => 3
    [3] => 4
    [4] => 5
)

JavaScript - массив Array:

let arr = new Array(1, 2, 3, 4, 5);
console.log(arr);
[1, 2, 3, 4, 5]

Java - класс ArrayList:

import java.util.ArrayList;

ArrayList list = new ArrayList<>();
list.add(1);
list.add(2);
System.out.println(list);
[1, 2]

C# - массив Array:

int[] arr = new int[] {1, 2, 3, 4, 5};
Console.WriteLine(string.Join(", ", arr));
1, 2, 3, 4, 5

Go - срезы (slices):

package main
import "fmt"

func main() {
    arr := []int{1, 2, 3, 4, 5}
    fmt.Println(arr)
}
[1 2 3 4 5]

Основное отличие Python array.array от аналогов в других языках - строгая типизация элементов при сохранении гомогенности данных, что обеспечивает экономию памяти.

Распространенные ошибки при работе с array.array

Несоответствие типа данных типовому коду:

import array

try:
    arr = array.array('i', [1, 2.5, 3])
except TypeError as e:
    print(f'Ошибка: {e}')
Ошибка: integer argument expected, got float

Использование неверного типового кода:

import array

try:
    arr = array.array('x', [1, 2, 3])
except ValueError as e:
    print(f'Ошибка: {e}')
Ошибка: bad typecode (must be b, B, u, h, H, i, I, l, L, q, Q, f or d)

Операции с массивами разных типов:

import array

arr1 = array.array('i', [1, 2, 3])
arr2 = array.array('f', [1.0, 2.0, 3.0])
try:
    result = arr1 + arr2
except TypeError as e:
    print(f'Ошибка: {e}')
Ошибка: can only concatenate array (not "array") to array

Изменение размера массива во время итерации:

import array

arr = array.array('i', [1, 2, 3, 4, 5])
try:
    for i, val in enumerate(arr):
        if val == 3:
            arr.pop(i)
except RuntimeError as e:
    print(f'Ошибка: {e}')
Ошибка: array mutated during iteration

Изменения в array.array в последних версиях Python

В Python 3.3 была добавлена поддержка формата 'u' для Unicode символов, но в Python 3.3 она стала устаревшей и удалена в Python 3.12. В Python 3.4 улучшена производительность операций с массивами. Начиная с Python 3.9, улучшена совместимость с аннотациями типов. В Python 3.11 оптимизирована работа методов массива для повышения производительности. Для типовых кодов 'q' и 'Q' (long long) в 64-битных системах обеспечена корректная работа на различных платформах.

Расширенные примеры работы с array.array

Использование памяти массива через буферный протокол:

Пример python
import array

arr = array.array('d', [1.0, 2.0, 3.0, 4.0])
# Получение raw буфера
buffer = memoryview(arr)
print(f'Буфер: {buffer.tolist()}')
Буфер: [1.0, 2.0, 3.0, 4.0]

Конвертация массива в bytes и обратно:

Пример python
import array

arr = array.array('B', [65, 66, 67, 68])
bytes_data = arr.tobytes()
print(f'Байты: {bytes_data}')

new_arr = array.array('B')
new_arr.frombytes(bytes_data)
print(f'Восстановленный массив: {new_arr}')
Байты: b'ABCD'
Восстановленный массив: array('B', [65, 66, 67, 68])

Использование массива для бинарного файла:

Пример python
import array, tempfile

arr = array.array('i', range(10))

with tempfile.NamedTemporaryFile(mode='wb', delete=False) as f:
    arr.tofile(f)
    filename = f.name

new_arr = array.array('i')
with open(filename, 'rb') as f:
    new_arr.fromfile(f, 10)

print(f'Прочитанный массив: {new_arr.tolist()}')
Прочитанный массив: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

Массивы для работы с аудиоданными:

Пример python
import array, math

# Генерация синусоидального сигнала
sample_rate = 44100
frequency = 440
duration = 1

samples = array.array('h')
for i in range(int(sample_rate * duration)):
    value = int(32767 * math.sin(2 * math.pi * frequency * i / sample_rate))
    samples.append(value)

print(f'Сгенерировано {len(samples)} сэмплов')
print(f'Первые 5 значений: {samples[:5]}')
Сгенерировано 44100 сэмплов
Первые 5 значений: array('h', [0, 2057, 4107, 6140, 8140])

Массивы с пользовательским типом данных:

Пример python
import array

# Использование беззнаковых целых для хранения RGB значений
pixels = array.array('B', [255, 0, 0, 0, 255, 0, 0, 0, 255])
print(f'RGB пиксели: {pixels.tolist()}')
RGB пиксели: [255, 0, 0, 0, 255, 0, 0, 0, 255]

питон array.array function comments

En
Array.array Compact array of values