Часть приложения, которое я разрабатываю, требует от меня применения масштабного коэффициента и смещения к значению (или массиву) в Python, чтобы уменьшить его объем памяти (чтобы при сохранении в файл я в конечном итоге уменьшал размер файла)например, сохраняя uint16 вместо float, например).Это связано с: модулем / методом для оптимизации использования памяти массива NumPy
В настоящее время это выглядит следующим образом:
def get_scale_and_offset(values_range, input_value, dtype=np.uint16):
target_max = np.iinfo(dtype).max
target_min = np.iinfo(dtype).min
target_range = target_max - target_min
# Effective range of data
input_min = min(values_range)
input_range = max(values_range)-min(values_range)
# Calculate scale factor
scale_factor = input_range / target_range
# Calculate offset to bring the minimum to target_minimum
offset = input_min - target_min
print(input_value * scale_factor + offset)
get_scale_and_offset([0, 1000], 68.235)
>>> 68.22499427786678
Как вы можете видетьвходное значение не совпадает с выходным значением после применения масштабного коэффициента и смещения.Я знаю, что это связано с количеством десятичных разрядов / значащих цифр, которое имеет scale_factor, но мне было интересно, есть ли у кого-нибудь альтернативный подход?
Я знаю, что могу прямо форсировать значение / массив до np.uint16 использует .astype(np.unit16)
, но это потеряет точность.Я хочу, чтобы 68.235 входило, масштабировалось и смещалось, а 68.235 выходило.
ПРИМЕЧАНИЕ: Переданные значения не всегда будут иметь 3 значащие цифры, могут быть больше, могут быть меньше - этот метод должен просто масштабировать и смещать значение, чтобы преобразовать их в uint16 без потериточность.