Введение
В этой лабораторной работе вы узнаете о структурированных массивах в 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.



