изменение массива numpy с типа int64 на тип int32 приводит к искажению данных

#python #numpy #castin& #int32

#python #numpy #Кастинг #int32

Вопрос:

Я использую очень большой набор данных с pandas, и чтобы уменьшить использование памяти, я перевел все свои столбцы из float64 во float32 и из int64 в int32. Один из столбцов представляет собой временную метку в наносекундах (что-то вроде 1594686594613248). Перед приведением он имеет только положительные значения. После приведения он имеет в основном отрицательные значения. Есть ли какая-либо ошибка с astype(‘int32’)? Чего мне здесь не хватает.

Соответствующий код:

 data_uid_label = pd.read_csv('label_to_uid.csv')
types = data_uid_label.dtypes
for name in data_uid_label.columns:
    if(types[name]=='float64'):
        data_uid_label[name]=data_uid_label[name].astype('float32')
    if(types[name]=='int64'):
        data_uid_label[name]=data_uid_label[name].astype('int32')
  

Спасибо

Комментарии:

1. Если вы не возражаете против потери некоторой точности, возможно, преобразуйте ваши временные метки в секунды / миллисекунды, чтобы их можно было представить в виде более мелких dtypes.

Ответ №1:

для представления 1594686594613248 требуется 51 бит, поэтому он вписывается в 64-битное число (int64), но не в 32-битное (int32). Он переполняется:

  • Все биты, оставшиеся от 32-го, усекаются, т.е. выбрасывается, что приводит к совершенно другим (меньшим) значениям
  • Из-за внутреннего представления целых чисел новый крайний левый бит (32-й) определяет, является ли число положительным или отрицательным, отсюда и получаемые отрицательные результаты

Только приводимые столбцы, в которых вы уверены, не содержат значений, которые слишком велики для меньших типов. В большинстве случаев это даже не стоит минимального увеличения объема памяти, если у вас нет миллионов точек данных.

Ответ №2:

Значение превышает предел int32 .

Предел int32 равен целому числу (от-2147483648 до 2147483647) (< 1594686594613248, ваше значение). Итак, вы получаете неправильные значения. Смотрите здесь.