Numpy сохраняет большие целые числа в виде поплавков

#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 вы можете запретить ему изменять большие целые числа на плавающие в диалоговом окне импорта данных. Я часто использую этот трюк.