np.int64 - это меньший контейнер, чем np.int ....? - PullRequest
0 голосов
/ 26 сентября 2019

Я получаю удивительное поведение, пытаясь преобразовать микросекундную строковую дату в целое число:

n = 20181231235959383171
int_ = np.int(n)  # Works
int64_ = np.int64(n)  # "OverflowError: int too big to convert"

Есть идеи почему?

Редактировать - Спасибо всем, это информативно, однако, пожалуйста, посмотрите мою актуальную проблему: Столбец Dataframe не будет преобразован из целочисленной строки в фактическое целое число

Ответы [ 2 ]

2 голосов
/ 26 сентября 2019

При использовании в качестве dtype, np.int эквивалентно np.int_ (размер зависит от архитектуры), что, вероятно, np.int64.Так что np.array([n], dtype=np.int) потерпит неудачу.Снаружи dtype, np.int ведет себя как Python int.Numpy в основном помогает вам рассчитать как можно больше материала в C-land, чтобы ускорить вычисления и сохранить память;но (AFAIK) целых чисел больше 64 бит не существует в стандарте C (хотя новый GCC поддерживает их на некоторых архитектурах).Таким образом, вы застряли, используя целые числа Python, медленные, но неограниченного размера, или целые числа C, быстрые, но недостаточно большие для этого.

Существует два очевидных способа вставить большое целое число в массив numpy:

  • Вы можете использовать тип Python, обозначенный dtype=object: np.array([n], dtype=object) будет работать, но вы не получите никаких преимуществ в ускорении или памяти от numpy.

  • Вы можете разделить микросекундное время на второе время (n // 1000000) и секунды (n % 1000000), как два отдельных столбца.

2 голосов
/ 26 сентября 2019

np.int может быть произвольно большим, как целое число в питоне.

np.int64 может варьироваться только от -2 63 до 2 63 -1. Ваш номер выпадает за пределы этого диапазона.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...