Тип float16
Тип float16 в NumPy представляет собой 16-битное число с плавающей запятой.
Он занимает в два раза меньше памяти, чем стандартный float32,
и в четыре раза меньше, чем float64. Этот тип данных особенно полезен
при работе с большими массивами, нейронными сетями и задачами машинного обучения,
где важна экономия памяти и скорость вычислений.
Однако стоит помнить, что float16 имеет ограниченную точность:
он может точно представлять только числа с примерно 3-4 десятичными знаками.
Диапазон значений составляет приблизительно от ±6.1e-5 до ±6.5e+4.
При выходе за эти пределы значения превращаются в бесконечность или ноль.
Синтаксис
Для создания массива с типом float16 укажите его в параметре
dtype при создании массива или используйте строковый код типа:
import numpy as np
# Способ 1: через параметр dtype
arr = np.array([1, 2, 3], dtype=np.float16)
# Способ 2: через строковый код типа
arr = np.array([1, 2, 3], dtype='float16')
# Способ 3: приведение существующего массива
arr = np.array([1.5, 2.7, 3.9]).astype(np.float16)
Пример
Создадим массив чисел и укажем тип float16 при создании:
import numpy as np
arr = np.array([1.1, 2.2, 3.3, 4.4, 5.5], dtype=np.float16)
print(arr)
print(arr.dtype)
Результат выполнения кода:
[1.1 2.2 3.3 4.4 5.5 ]
float16
Пример
Покажем разницу в точности между float16 и float64
при вычислениях с числами, близкими к пределу точности:
import numpy as np
# Массив с типом float16
arr16 = np.array([0.1], dtype=np.float16)
# Тот же массив с типом float64
arr64 = np.array([0.1], dtype=np.float64)
res16 = arr16 * 10
res64 = arr64 * 10
print("float16:", res16[0])
print("float64:", res64[0])
print("Разница:", res64[0] - res16[0])
Результат выполнения кода:
float16: 1.0
float64: 1.0
Разница: 0.0
Пример
Продемонстрируем переполнение при выходе за допустимый диапазон
типа float16 (максимальное значение около 65504):
import numpy as np
arr = np.array([1e4, 1e5, 1e6], dtype=np.float16)
print(arr)
Результат выполнения кода:
[10000. inf inf]
Пример
Преобразуем массив с типом float64 в float16
для экономии памяти:
import numpy as np
# Создаём большой массив float64
arr64 = np.random.default_rng(0).random(1000000)
# Преобразуем в float16
arr16 = arr64.astype(np.float16)
print("Размер arr64:", arr64.nbytes, "байт")
print("Размер arr16:", arr16.nbytes, "байт")
print("Экономия:", arr64.nbytes - arr16.nbytes, "байт")
Результат выполнения кода:
Размер arr64: 8000000 байт
Размер arr16: 2000000 байт
Экономия: 6000000 байт