Содержание
Типы данных NumPy
Мощь NumPy обусловлена его эффективным объектом ndarray
(N-мерный массив). В отличие от списков Python, массивы NumPy однородны; все элементы имеют один и тот же тип данных. Эта однородность позволяет проводить оптимизированные векторизованные операции, значительно повышая производительность. NumPy предлагает широкий спектр типов данных, многие из которых дублируют типы в C и Fortran, каждый со своим сокращенным кодом:
Тип данных | Описание | Код типа NumPy |
---|---|---|
Целое число | Знаковое целое число | int8 , int16 , int32 , int64 |
Беззнаковое целое число | Беззнаковое целое число | uint8 , uint16 , uint32 , uint64 |
Число с плавающей точкой | Числа с плавающей точкой одинарной и двойной точности | float16 , float32 , float64 (обычно float ) |
Комплексное число с плавающей точкой | Комплексные числа одинарной и двойной точности | complex64 , complex128 (обычно complex ) |
Логический | Значения True/False | bool |
Строка | Строки фиксированной длины | str (или string_ с длиной, например, string_10 ) |
Юникод | Юникодные строки фиксированной длины | unicode_ (например, unicode_10 ) |
Объект | Произвольные объекты Python | object |
Указание типов данных:
При создании массива можно явно задать тип данных с помощью аргумента dtype
:
import numpy as np
arr_int = np.array([1, 2, 3, 4], dtype=np.int32)
print(arr_int.dtype) # Вывод: int32
arr_float = np.array([1.1, 2.2, 3.3], dtype=np.float64)
print(arr_float.dtype) # Вывод: float64
arr_mixed = np.array([1, 2.5, 3]) # тип данных будет повышен до float64
print(arr_mixed.dtype) # Вывод: float64
Тщательный выбор типа данных имеет решающее значение для эффективности использования памяти и производительности. Меньшие типы (например, int32
) экономят память, но могут привести к переполнению, если значения превышают их диапазон.
Преобразование типов данных
Преобразование между типами данных является распространенной операцией. NumPy предоставляет несколько методов:
1. Использование astype()
:
astype()
создает копию с новым типом данных:
arr_int = np.array([1, 2, 3], dtype=np.int32)
arr_float = arr_int.astype(np.float64)
print(arr_float) # Вывод: [1. 2. 3.]
print(arr_float.dtype) # Вывод: float64
2. Неявное преобразование типов:
NumPy иногда неявно преобразует типы данных во время выполнения операций:
arr_int = np.array([1, 2, 3])
arr_float = np.array([1.1, 2.2, 3.3])
result = arr_int + arr_float
print(result) # Вывод: [2.1 4.2 6.3]
print(result.dtype) # Вывод: float64
3. Использование view()
(Использовать с осторожностью!):
view()
создает новый массив, использующий те же данные, но с другим типом. Изменения в одном представлении влияют на другое. Это эффективно с точки зрения памяти, но опасно:
arr_int = np.array([1, 2, 3], dtype=np.int32)
arr_view = arr_int.view(np.float32) # Потенциально опасно!
print(arr_view) # Вывод: [1. 2. 3.]
arr_view[0] = 10.5 # Также изменяет оригинал!
print(arr_int) # Вывод: [10 2 3]
Понимание типов данных и преобразования в NumPy имеет важное значение для написания эффективного и надежного кода. Выбирайте подходящие типы и используйте view()
с осторожностью, учитывая потенциальную потерю данных или неожиданное поведение.