#numpy
#numpy
Вопрос:
У меня возникли проблемы с сохранением больших целых чисел в виде чисел с плавающей запятой. Вот простой пример, сначала я создаю массив numpy из больших целых чисел.
from random import randint
import numpy as np
min_int = 182_134_926_853_412_476
rand_big_ints = [randint(min_int, 2 * min_int) for _ in range(10)]
np_rand_big_ints = np.array(rand_big_ints)
Я проверяю, что это целые числа
array([252684792489159497, 247692926601611023, 223174123368132841,
255596017185852990, 318647893588684448, 331851729687912180,
191223276914989801, 239394981298569364, 199835758154280122,
313714064550926566], dtype=int64)
Затем я сохраняю их, используя savetxt
функцию numpy
np.savetxt('rand_big_ints.csv', np_rand_big_ints, delimiter=',')
Но когда я просматриваю результирующий CSV-файл, большие целые числа отображаются в CSV в виде чисел с плавающей запятой, что приводит к потере информации.
2.526847924891594880e 17
2.476929266016110080e 17
2.231741233681328320e 17
2.555960171858529920e 17
3.186478935886844160e 17
3.318517296879121920e 17
1.912232769149897920e 17
2.393949812985693760e 17
1.998357581542801280e 17
3.137140645509265920e 17
Я могу обойти это, преобразовав массив в серию pandas и затем сохранив его, но как мне заставить numpy соблюдать «тип» и не отображать большие целые числа в виде чисел с плавающей запятой?
Ответ №1:
Просто укажите целочисленный формат:
np.savetxt('rand_big_ints.csv', np_rand_big_ints, fmt='%d', delimiter=',')
Ответ №2:
Вам необходимо отформатировать значения в виде строк
np.savetxt('rand_big_ints.csv', np_rand_big_ints.astype(str), fmt='"%s"', delimiter=',')
fmt='%s'
также работает, если вы просматриваете файл как текст, но инструменты электронных таблиц не поддерживают big int, поэтому они снова усекают значения до float
Комментарии:
1. С помощью Excel вы можете запретить ему изменять большие целые числа на плавающие в диалоговом окне импорта данных. Я часто использую этот трюк.