Структурированные массивы в NumPy

NumPyBeginner
Практиковаться сейчас

Введение

В этой лабораторной работе вы узнаете о структурированных массивах в NumPy. Структурированные массивы — это мощная функция для работы с гетерогенными данными, аналогичная таблицам в базе данных или электронной таблице. Каждый элемент структурированного массива можно рассматривать как строку с именованными столбцами, называемыми "полями" (fields). Это делает их идеальными для организации и манипулирования табличными данными непосредственно в Python.

В ходе этой лабораторной работы вы будете писать и выполнять код Python в файле structured_arrays.py, предоставленном в WebIDE.

Создание и доступ к структурированному массиву

Сначала давайте создадим простой структурированный массив. Тип данных (dtype) структурированного массива определяется как список кортежей. Каждый кортеж указывает поле с его (имя, тип_данных). Это позволяет нам хранить различные типы данных, такие как строки и целые числа, в одном массиве.

Откройте файл structured_arrays.py из файлового проводника на левой панели. Добавьте следующий код для создания структурированного массива, представляющего список людей с их именами и возрастом.

## Create a structured array
data = np.array([('Alice', 25, 55.5), ('Bob', 30, 68.0)],
                dtype=[('name', 'U10'), ('age', 'i4'), ('weight', 'f4')])

print("Original Array:")
print(data)

## Access a specific field by its name
names = data['name']
print("\nNames field:")
print(names)

Пояснение кода:

  • import numpy as np: Эта строка импортирует библиотеку NumPy.
  • np.array([...], dtype=[...]): Мы создаем массив. Первый аргумент — это список кортежей, где каждый кортеж ('Alice', 25, 55.5) представляет одну строку данных.
  • dtype=[('name', 'U10'), ('age', 'i4'), ('weight', 'f4')]: Это ключевая часть. Мы определяем три поля:
    • 'name': Строка Unicode с максимальной длиной 10 символов (U10).
    • 'age': 4-байтовое (32-битное) целое число (i4).
    • 'weight': 4-байтовое (32-битное) число с плавающей запятой (f4).
  • data['name']: Мы можем получить доступ ко всем значениям из определенного поля (столбца), используя его имя в качестве индекса, что возвращает новый массив NumPy.

Теперь сохраните файл и запустите его из терминала, чтобы увидеть вывод.

python structured_arrays.py

Вы должны увидеть следующий вывод, который показывает полный структурированный массив и массив, содержащий только имена.

Original Array:
[('Alice', 25, 55.5) ('Bob', 30, 68. )]

Names field:
['Alice' 'Bob']

Изменение полей и индексация

Структурированные массивы являются изменяемыми (mutable), что означает, что вы можете изменять их значения. Вы можете изменить целое поле целиком или получить доступ к конкретному элементу по его индексу, а затем изменить его поле. Вы также можете создать новый массив, содержащий подмножество исходных полей.

Добавьте следующий код в конец вашего скрипта structured_arrays.py.

## Modify the 'age' field
data['age'] = [26, 31]
print("\nArray after modifying age:")
print(data)

## Access a single element (the first row)
first_person = data[0]
print("\nFirst person's data:")
print(first_person)

## Create a new array with a subset of fields
subset = data[['name', 'weight']]
print("\nSubset of array (name and weight):")
print(subset)

Пояснение кода:

  • data['age'] = [26, 31]: Это присваивает новый список значений полю age, обновляя весь столбец.
  • data[0]: Это обращается к первому элементу (строке) массива. Результатом является скаляр NumPy типа void (void scalar), который содержит данные для этой одной строки.
  • data[['name', 'weight']]: Передавая список имен полей, вы можете выбрать несколько столбцов, что создает новый структурированный массив только с этими полями.

Сохраните файл и запустите его снова из терминала.

python structured_arrays.py

Теперь ваш вывод будет включать новые разделы, показывающие измененный массив и подмножество.

... (предыдущий вывод) ...

Array after modifying age:
[('Alice', 26, 55.5) ('Bob', 31, 68. )]

First person's data:
('Alice', 26, 55.5)

Subset of array (name and weight):
[('Alice', 55.5) ('Bob', 68. )]

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

Хотя индексация по имени (например, data['name']) является мощной, она может быть многословной. NumPy предоставляет специальный подкласс ndarray под названием массив записей (np.recarray). Массивы записей позволяют получать доступ к полям как к атрибутам, используя точечную нотацию (например, record_array.name), что может сделать ваш код более чистым и читаемым.

Вы можете создать массив записей напрямую или преобразовать существующий структурированный массив. Давайте посмотрим, как сделать и то, и другое. Добавьте следующий код в конец файла structured_arrays.py.

## Convert the structured array to a record array using view()
record_array = data.view(np.recarray)

print("\nType of the new view:")
print(type(record_array))

## Access fields using attribute (dot) notation
print("\nAccessing names via attribute:")
print(record_array.name)

print("\nAccessing ages via attribute:")
print(record_array.age)

Пояснение кода:

  • data.view(np.recarray): Метод .view() создает новый объект массива, который смотрит на те же данные. Указав np.recarray, мы получаем представление нашего структурированного массива данных в виде массива записей. Данные не копируются; это просто другой способ взаимодействия с ними.
  • record_array.name: Это ключевая особенность массивов записей. Вы можете получить доступ к полю name, как если бы это был атрибут объекта. Это эквивалентно record_array['name'].

Сохраните файл и выполните его.

python structured_arrays.py

Вывод теперь покажет тип нового представления массива и продемонстрирует доступ к атрибутам.

... (предыдущий вывод) ...

Type of the new view:
<class 'numpy.recarray'>

Accessing names via attribute:
['Alice' 'Bob']

Accessing ages via attribute:
[26 31]

Резюме

В этой лабораторной работе вы изучили основы использования структурированных массивов в NumPy. Вы начали с создания структурированного массива с именованными полями и несколькими типами данных. Затем вы отработали доступ к конкретным полям (столбцам) с использованием индексации по ключу в стиле словаря и изменение их значений. Наконец, вы изучили массивы записей (record arrays) — удобную альтернативу, которая позволяет получать доступ к полям как к атрибутам, и узнали, как преобразовывать между стандартными структурированными массивами и массивами записей с помощью метода .view().

Структурированные массивы являются важным инструментом для работы со сложными табличными наборами данных в научных вычислениях и анализе данных с использованием Python.