#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, ваше значение). Итак, вы получаете неправильные значения. Смотрите здесь.