Какой вариант fmt в numpy .savetxt сохраняет бесконечную целочисленную точность? - PullRequest
1 голос
/ 14 июля 2020

Я использовал numpy.savetxt без указания опции fmt, и иногда, когда предполагается сохранить особенно большое целое число, оно записывается с обозначением e как число с плавающей запятой некоторой конечной точности. Я хотел бы, чтобы все целые числа, независимо от количества цифр, записывались без потерь, просто включая все цифры. Однако, читая документацию по формату , мне не ясно, какой вариант fmt приведет к хранению целых чисел без потерь.

Какую настройку fmt мне следует использовать?

Ответы [ 2 ]

3 голосов
/ 14 июля 2020

Используйте '%s' или '%r', которые просто вызывают str или repr для элементов вашего массива соответственно.

Кроме того, вы читаете документацию о неверной строке формата. (Это документация по форматной строке, на которую ссылаются numpy.savetxt документы, но это все равно неверно.) numpy.savetxt использует форматирование % старой школы, задокументированное здесь .

1 голос
/ 14 июля 2020
In [53]: arr = np.array([1.232, 1.232423423234235352352535235253])                                   
In [54]: arr.dtype                                                                                   
Out[54]: dtype('float64')
In [55]: arr                                                                                         
Out[55]: array([1.232     , 1.23242342])

savetxt выполняет итерацию по «строкам» вашего массива и форматирует каждую с помощью fmt:

In [56]: tuple(arr)                                                                                  
Out[56]: (1.232, 1.2324234232342353)
In [57]: '%f, %.16f'%tuple(arr)                                                                      
Out[57]: '1.232000, 1.2324234232342353'

Действие в [57] является прямым форматированием Python. savetxt docs резюмирует это форматирование со ссылкой на полную Python docs.

oops - я продемонстрировал float; вы хотите целое число. int64 - максимальное целое число dtype. object dtype может содержать python целые числа, если может быть длиннее.

====

Наибольшее число c dtype равно np.int64:

Out[86]: array([               1232, 1232423423234235352])
In [87]: arr.dtype                                                                                   
Out[87]: dtype('int64')
In [88]: '%g, %d'%tuple(arr)                                                                         
Out[88]: '1232, 1232423423234235352'

Целые числа большего размера хранятся как Python целочисленные объекты. Математика с такими массивами не такая быстрая и неполная.

In [89]: arr = np.array([1232, 1232423423234235352999])                                              
In [90]: arr                                                                                         
Out[90]: array([1232, 1232423423234235352999], dtype=object)
In [91]: '%g, %d'%tuple(arr)                                                                         
Out[91]: '1232, 1232423423234235352999'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...