Вывод переменной numpy с форматированием и без него дает разные значения

Вопросы и ответы

Работая с numpy, я заметил что-то странное. Когда я печатаю переменную, используя print(), и форматирую вывод с помощью print(f'{:.9f}), это дает разные значения.

Например, введите описание изображения здесь

или

введите описание изображения здесь

Я не уверен, почему это происходит. Переменная lidar_synchronized_timeshamps сначала читается как список строк, затем преобразуется в массив numpy, используя np.asarray().astype(np.float128). Любая помощь в понимании, что здесь происходит, действительно ценится.

Ответ

Когда вы работаете с переменными в NumPy и сталкиваетесь с различиями в отображении значений при использовании обычной функции print() и форматированного вывода с помощью f-строк (например, print(f'{<variable>:.9f}')), это часто может быть связано с различиями в точности и округлении.

Причины различий

  1. Тип данных: В вашем случае вы используете np.float128, который поддерживает большую точность по сравнению с обычными типами данных с плавающей запятой. Python может по-разному обрабатывать представление и округление значений в зависимости от формата.

  2. Функция print(): Когда вы просто вызываете print(variable), NumPy выводит значение в соответствии со своим внутренним представлением, которое может не показывать все значимые цифры, особенно для высокоточных чисел.

  3. Форматированный вывод: Используя f-строку с заданным форматом (например, .9f), вы указываете Python округлить значение до 9 десятичных знаков. Это может привести к тому, что вы увидите значения, которые лучше представлены в виде округленных или более "aclosed" (с округлением с учетом знаков) по сравнению с тем, как NumPy обычно отображает эти значения.

Пример

Рассмотрим пример, который иллюстрирует данную проблему:

import numpy as np

# Пример: список строк
strings = ['0.12345678901234567890', '0.98765432109876543210']

# Преобразование в numpy массив с типом float128
lidar_synchronized_timestamps = np.asarray(strings).astype(np.float128)

# Обычный вывод
print(lidar_synchronized_timestamps)

# Форматированный вывод с 9 знаками после запятой
for value in lidar_synchronized_timestamps:
    print(f'{value:.9f}')

Вывод может быть таким:

[0.12345678901234567890 0.98765432109876543210]
0.123456789
0.987654321

Заключение

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

Если важно получить одну и ту же точность, используйте один и тот же метод для вывода значений (либо только print(), либо только форматированный вывод).

Оцените материал
Добавить комментарий

Капча загружается...