Автоматическое преобразование numpy dtypes в Python типы
Быстрый ответ
Если потребность сводится к быстрой конвертации типов данных из numpy в базовые типы Python, вы можете использовать метод .item()
для индивидуальных элементов и метод .tolist()
для массивов в совокупности. Для преобразования отдельного числа достаточно применить выражение np_int64_var.item()
, которое вернёт соответствующий тип данных Python. Для приведения всего массива к списку Python подойдет вызов numpy_arr.tolist()
, после чего каждый элемент массива преобразуется.
Пример для скалярного значения:
# Преобразуем целое число из numpy в целое число Python
python_int = np.int64(10).item() # Вернет 10 в качестве целого числа Python
Пример для массива:
# Массив из numpy преобразуем в список Python
python_list = np.array([1, 2, 3], dtype=np.int64).tolist() # Получим [1, 2, 3] в формате списка Python
Преодоление нестандартных случаев
В процессе преобразований у вас могут возникнуть особые ситуации – преобразованные значения или более сложные случаи. Но не вздумайте беспокоиться: найдется решение каждой проблемы:
- Проверка перед преобразованием: Чтобы узнать, является ли значение скаляром numpy или уже принадлежит к типам Python, примените
isinstance(val, np.generic)
. - Функция
numpy.asscalar()
: Эта функция переводит массив из единичного элемента в соответствующий ему тип данных Python. - Персонализированный навигатор по типам: Создайте собственную карту соответствия при помощи словаря, сгенерированного с помощью генераторов.
Пример проверки перед преобразованием:
import numpy as np
val = np.int64(10)
# Превращаемся в подводника только после проверки глубины воды
if isinstance(val, np.generic):
val = val.item() # Производим преобразование только в случае, если val – это тип данных из NumPy
Развивайте навыки, применяя лучшие практики
Методы .tolist()
и .item()
невероятно полезны, однако рассмотрим их оптимальное использование в случае больших данных и сценариев, требующих высокой производительности.
- Обдуманное использование
tolist()
: Методtolist()
идеально подходит как для скаляров, так и для массивов, но с большими объёмами данных следует обращаться к нему осторожнее из-за вопросов производительности. - В помощь придут лямбда-функции: Составление лямбда-функций позволяет эффективно работать как с отдельными числами, так и с массивами.
Пример лямбда-функции, помогающей при преобразовании:
# Делаем свою жизнь проще
to_python_type = lambda x: x.tolist() if isinstance(x, np.ndarray) else x.item()
Визуализация
Визуализация преобразования между типами данных numpy и стандартными типами Python – источник истинного удовольствия:
Наборы данных NumPy (🧬): [np.int32, np.float64, np.bool_]
Типы Python (🐍): [int, float, bool]
Табличное представление преобразования из 🧬 в 🐍:
| Тип данных NumPy | ➡️ | Тип Python |
| ----------------- | --- | ----------- |
| `np.int32` | ➡️ | `int` |
| `np.float64` | ➡️ | `float` |
| `np.bool_` | ➡️ | `bool` |
Волшебство преобразования типов данных Numpy в стандартные типы Python на самом деле поражает воображение.
Лабиринт методов: Какой выбрать и когда?
Выбор конкретного метода преобразования зависит от контекста:
- Отдельные скалярные значения:
.item()
является наилучшим выбором для преобразования единичных скаляров numpy. - Полные массивы: Если вам необходимо преобразовать массив в список, используйте
.tolist()
. - Большие массивы: В случае работы с большими массивами подумайте о пошаговых методах преобразования или потоковых методиках, чтобы избежать переполнения памяти.
Пример функции для пошагового преобразования больших массивов:
def chunked_to_list(numpy_arr, chunk_size=100000):
"""Resize numpy array into a list in chunks.
How can you eat an elephant? Piece by piece!
"""
return sum((numpy_arr[i:i+chunk_size].tolist() for i in range(0, len(numpy_arr), chunk_size)), [])
Понимание соответствий
Важно понимать, как типы данных NumPy соотносятся с типами данных Python, чтобы избежать ошибок при конвертации и не только.
- Потеря точности: Держите в уме вероятную потерю точности из-за более высокой точности некоторых типов данных NumPy.
- Неточное соответствие: Некоторые типы данных NumPy не имеют прямых аналогов в Python. В таких случаях выбирайте наиболее подходящее соответствие.
Для создания ваших собственных карт соответствия между типами данных NumPy и Python вы можете использовать следующий фрагмент кода:
# Словно переводить иностранную речь на понятный язык!
dtypes_mapping = {dtype: np.zeros(1, dtype).tolist()[0].__class__ for dtype in np.sctypes['others']}
Полезные материалы
- Data type objects (dtype) — NumPy v1.26 Manual — Погрузитесь шаг за шагом в руководство по dtype, созданное авторами NumPy.
- Built-in Types — Python 3.12.2 documentation — Материал по встроенным типам данных, которые заслуженно гордятся в Python.
- Basic Data Types in Python – Real Python — Изучите подробности использования типов данных Python под присмотром наших экспертов.
- GitHub – numpy/numpy: The fundamental package for scientific computing with Python. — Изучите вдоль и поперек проект NumPy, используя для этого исходный код и возможности коллаборации.
- Reducing NumPy memory usage with lossless compression — Научитесь грамотно управлять расходом памяти, чтобы сохранить её для истинно важных задач.