Атрибут dtype в NumPy

Определение типа данных в массиве dtype (Data type objects)

NumPy — мощный инструмент для научных вычислений в Python, и одной из его ключевых особенностей является возможность явного контроля над типами данных в массивах. В этой статье мы углубимся в понимание атрибута dtype и узнаем, как он может помочь вам в работе с данными.

Что такое dtype

Атрибут dtype массива в NumPy показывает тип данных элементов в массиве. В отличие от стандартных списков Python, где элементы могут иметь разные типы данных, массивы в NumPy имеют однородный тип данных.

Примеры

Базовое использование dtype

import numpy as np

array = np.array([1, 2, 3, 4, 5])
print(array.dtype)

# int32

Этот массив явно содержит целые числа, и dtype подтверждает это, указывая, что тип данных элементов массива — 32-битное целое число.

Вещественные числа

array_float = np.array([1.2, 2.5, 3.1, 4.7, 5.0])
print(array_float.dtype)

# float64

В этом массиве у нас есть вещественные числа, и dtype указывает на это, показывая, что тип данных — 64-битное вещественное число.

Явное указание dtype

Вы также можете явно указать dtype при создании массива:

array_int32 = np.array([1, 2, 3, 4, 5], dtype=np.int32)
print(array_int32.dtype)

# int32

Переключение между типами данных

Вы можете изменить тип данных массива с помощью метода astype.

array = np.array([1.5, 2.6, 3.7, 4.8])
print(array.dtype)

int_array = array.astype(np.int32)
print(int_array.dtype)

# float64
# int32

Типы данных в NumPy

В NumPy имеется множество встроенных типов данных, которые позволяют эффективно представлять и обрабатывать данные различной природы. Вот краткий обзор основных типов данных в NumPy:

Целые числа:

  • int8: 8-битное целое со знаком (-128 до 127).
  • int16: 16-битное целое со знаком (-32,768 до 32,767).
  • int32: 32-битное целое со знаком (-2^31 до 2^31 - 1).
  • int64: 64-битное целое со знаком (-2^63 до 2^63 - 1).

Беззнаковые целые числа:

  • uint8: 8-битное беззнаковое целое (0 до 255).
  • uint16: 16-битное беззнаковое целое (0 до 65,535).
  • uint32: 32-битное беззнаковое целое (0 до 2^32 - 1).
  • uint64: 64-битное беззнаковое целое (0 до 2^64 - 1).

Вещественные числа (плавающая точка):

  • float16: половинная точность.
  • float32: одинарная точность (стандарт IEEE 754).
  • float64: двойная точность (стандарт IEEE 754).

Комплексные числа:

  • complex64: Комплексные числа с двумя 32-битными вещественными компонентами.
  • complex128: Комплексные числа с двумя 64-битными вещественными компонентами.

Булев тип:

  • bool: Хранит значения True или False.

Строковые и символьные типы:

  • string_: Строка фиксированной длины.
  • unicode_: Unicode-строка фиксированной длины.

Обобщенные типы и пользовательские dtypes:

  • object: Тип для объектов Python.
  • void: Без типа, обычно используется для создания структурированных массивов.

Даты и время:

  • datetime64: Дата и время.
  • timedelta64: Разница между двумя датами/временами.

Другие:

  • busday: Рабочий день на базе 64-битного целого.

Создание собственных структур данных с dtype

В NumPy можно определять собственные структурированные типы данных. Это позволяет создавать массивы, которые по сути являются таблицами с разными типами данных в разных столбцах.

person_dtype = np.dtype({
    'names': ('name', 'age', 'weight'),
    'formats': ('U10', 'i4', 'f8')
})

people = np.array([('Alice', 24, 55.5), ('Bob', 30, 75.2)], dtype=person_dtype)
print(people)

Здесь мы создали массив из двух записей, каждая из которых содержит имя (строка длиной до 10 символов), возраст (целое 32-битное число) и вес (вещественное 64-битное число).

Подводные камни и предостережения

  • Преобразование типов: Когда вы явно преобразуете типы данных, будьте внимательны к возможным потерям данных. Например, преобразование float64 к int32 приведет к округлению значений.
  • Операции между разными dtype: При выполнении операций между массивами с разными dtype, NumPy будет пытаться "продвигать" типы данных. Это может привести к неожиданным результатам.

Заключение

Атрибут dtype в NumPy предоставляет глубокий контроль над тем, как данные представлены и хранятся. От базового понимания типов данных до создания собственных структур и управления порядком байтов — знание всех этих аспектов делает вас гораздо более подготовленным к сложным задачам научного программирования и анализа данных.

Содержание: