Перейти к содержимому

Как из float сделать int

  • автор:

Как преобразовать числа с плавающей запятой в целые числа в Pandas

Вы можете использовать следующий синтаксис для преобразования столбца в pandas DataFrame из числа с плавающей запятой в целое число:

df['float_column'] = df['float_column'].astype (int) 

В следующих примерах показано, как использовать этот синтаксис на практике.

Пример 1: преобразование одного столбца из числа с плавающей запятой в целое число

Предположим, у нас есть следующие Pandas DataFrame:

import pandas as pd #create DataFrame df = pd.DataFrame() #view data types for each column df.dtypes player object points float64 assists float64 dtype: object 

Мы видим, что столбцы очков и помощи имеют тип данных float.

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

#convert 'points' column to integer df['points'] = df['points'].astype (int) #view data types of each column df.dtypes player object points int32 assists float64 dtype: object 

Мы видим, что столбец точек теперь является целым числом, а все остальные столбцы остались без изменений.

Пример 2. Преобразование нескольких столбцов в целое число

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

import pandas as pd #create DataFrame df = pd.DataFrame() #convert 'points' and 'assists' columns to integer df[['points', 'assists']] = df[['points', 'assists']].astype (int) #view data types for each column df.dtypes player object points int32 assists int32 dtype: object 

Мы видим, что столбцы баллов и передач были преобразованы из чисел с плавающей запятой в целые числа.

Дополнительные ресурсы

В следующих руководствах объясняется, как выполнять другие распространенные преобразования в Python:

Преобразование float в int с инициализацией переменной на лету, адекватно?

Каким путем? У вас не ясно какой тип у x.
Видимо подразумевается, что x — int.
Выражение 2 * (a + y) в итоге имеет тип float.
Если x — int, то выражение будет преобразовано к int.
Правильно отбрасывать дробную часть или нет — зависит от задачи.
Если надо — отбрасывайте. Предложенный способ — вполне годный.
В любом случае лучше использовать явное преобразование. Это поможет людям, которые будут смотреть ваш код, понять, что это преобразование именно так и задумывалось, а не получилось случайно.

Рекомендую поставить опции компилятора на максимальные предупреждения и соответствия стандарту (для gcc -std=c11 -Wall -Wextra -pedantic) и пишите код так, что бы при сборке у компилятора не было предупреждений. Многие используют еще и -Werror — это прост вынуждает вас писать код без предупреждений, т.к. они теперь станут ошибками.

Тема: Преобразование из float в int

batur вне форума

По умолчаниюПреобразование из float в int

Привет всем, есть вопрос в плане передачи переменной int с пр200 на пк через преобразователь где установлена будет скада, пока не знаю что за версия.
например нужно мне отслеживать давление, изначально, в софте значение давления это переменная флоат, число с хвостом, например 2.5 бар, преобразую например в интежер, получаеться 2 бар.
Как сделать чтобы данные в скаде отображались правильно так же 2.5. бар а не 2 бар

10.03.2022, 15:17 #2

  • Просмотр профиля
  • Сообщения форума
  • Личное сообщение
  • Домашняя страница
  • Просмотр статей

Сергей0308 на форуме

Пользователь Регистрация 25.06.2011 Адрес Галактика Андромеды (M31) Сообщений 8,036

По умолчанию

ЦитатаСообщение от batur Посмотреть сообщение

Привет всем, есть вопрос в плане передачи переменной int с пр200 на пк через преобразователь где установлена будет скада, пока не знаю что за версия.
например нужно мне отслеживать давление, изначально, в софте значение давления это переменная флоат, число с хвостом, например 2.5 бар, преобразую например в интежер, получаеться 2 бар.
Как сделать чтобы данные в скаде отображались правильно так же 2.5. бар а не 2 бар

Такое впечатление, что Вы «первый раз замужем»(БМП), короче, округлите до десятых долей, умножьте на 10 и преобразуйте в инт, в ПР всё!
В скаде(или ОРС-сервере) преобразуете обратно во флоат и разделите на 10(перенести запятую на один знак влево), всё!

Последний раз редактировалось Сергей0308; 10.03.2022 в 15:26 .

Если проблему можно решить за деньги, это не проблема, это расходы. Бог каждому посылает проблемы по его силам. Так что одно из двух. Либо ты можешь-таки
справиться с проблемами, либо это не твои проблемы.

Как из float сделать int

Чето не могу найти нормального решения, которое было бы быстрее чем стандарные.
Я делаю так:

int i; float f=5.68; i=(int)f;

Возможно ли более быстро сделать данное преобразование?
Просто вычисления с float’ом работают раза в 2 медленнее чем с int’ом, а точность большая не нужна.
Дело в том что напрягает загрузка процессора, т.к. это дело в многократно вызываемом цикле.
Может есть какой-нить алгоритм на асме пошустрее? Или может какой-нить совет по настройкам оптимизации проекта. Интересны все предложения.
И ещё вопрос:
Что быстрее

a=i*256;

Re: Подскажите как быстро преобразовать float в int.

От: Socrat
Дата: 29.06.06 10:19
Оценка:

Здравствуйте, Voit, Вы писали:

V>Чето не могу найти нормального решения, которое было бы быстрее чем стандарные.
V>Я делаю так:

V>

V>int i; V>float f=5.68; V>i=(int)f; V>

V>Возможно ли более быстро сделать данное преобразование?

Нельзя. Если даже ты не используешь сопроцессор, вряд ли ты сможешь написать преобразование более быстрое, чем уже есть.

V>Просто вычисления с float’ом работают раза в 2 медленнее чем с int’ом, а точность большая не нужна.
V>Дело в том что напрягает загрузка процессора, т.к. это дело в многократно вызываемом цикле.

Можно попробовать обойтись без плавающей точки.

V>Может есть какой-нить алгоритм на асме пошустрее? Или может какой-нить совет по настройкам оптимизации проекта. Интересны все предложения.
V>И ещё вопрос:
V>Что быстрее

V>a=i*256; V>
V>a=i>>8; V>

Сдвиг быстрей. Только не туда двигаешь.

Re[2]: Подскажите как быстро преобразовать float в int.

От: Сергей Мухин
Дата: 29.06.06 10:35
Оценка: +1 -1

Здравствуйте, Socrat, Вы писали:

V>>Что быстрее

V>>

V>>a=i*256; V>>
V>>a=i>>8; V>>

с какого испуга?

посмотри генерацию (при вкл оптим).


С уважением,
Сергей Мухин
Re: Подскажите как быстро преобразовать float в int.

От: Какая разница
Дата: 29.06.06 10:42
Оценка:

Здравствуйте, Voit, Вы писали:

V>Чето не могу найти нормального решения, которое было бы быстрее чем стандарные.
V>Я делаю так:

V>

V>int i; V>float f=5.68; V>i=(int)f; V>

V>Возможно ли более быстро сделать данное преобразование?

Откуда уверенность что это самое узкое место в твоей программе?
Что тебе даст выиграш нескольких тактов процессора если ты умудришся
на асме запрограмировать быстрее чем компалятор?
Сомневаюсь что сможешь это сделать лучше
Сначала надо взять профилер в зубы и найти в программе те куски которые дают наибольшие тормоза
Поверь мне это будет не это преобразование

ЗЫ Ну и неплохо было бы преобразовать в инт поинтелегентней (по правилам округления)

i=(int) (f + 0.5f);

Re: Подскажите как быстро преобразовать float в int.

От: Какая разница
Дата: 29.06.06 10:50
Оценка:

Здравствуйте, Voit, Вы писали:
.
V>И ещё вопрос:
V>Что быстрее

V>a=i*256; V>
V>a=i>>8; V>

Расслабься и не мучай себя сомнениями
Нормальный оптимизирующий компилятор сам знает что быстрей и сам сдвинет побитово
если это будет быстрее чем умножение

ЗЫ Причем сдвинет влево а не вправо как ты

Re: Подскажите как быстро преобразовать float в int.

От: Sh1ZoID http://vkontakte.ru/id6263850
Дата: 29.06.06 11:08
Оценка:

Здравствуйте, Voit, Вы писали:

V>Что быстрее

V>a=i*256; V>
V>a=i>>8; V>

int i = 23;
int c = i c = i * 255; //255

 ;int i = 23; 0041368E mov dword ptr [i],17h ;int c = i mov eax,dword ptr [i] 00413698 shl eax,8 ;смещает 0041369B mov dword ptr [c],eax ;c = i * 255; 0041369E mov eax,dword ptr [i] 004136A1 imul eax,eax,0FFh ;умножает 004136A7 mov dword ptr [c],eax

int i = 23;
int c = i c = i * 256; //256

 ;int i = 23; 0041368E mov dword ptr [i],17h ;int c = i mov eax,dword ptr [i] 00413698 shl eax,8 ;смещает 0041369B mov dword ptr [c],eax ;c = i * 255; 0041369E mov eax,dword ptr [i] 004136A1 shl eax,8 ;смещает 004136A7 mov dword ptr [c],eax

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

Re: Подскажите как быстро преобразовать float в int.

От: Leo Yuriev https://github.com/erthink
Дата: 29.06.06 11:13
Оценка: 1 (1) +1

Здравствуйте, Voit, Вы писали:

V>Чето не могу найти нормального решения, которое было бы быстрее чем стандарные.
V>Я делаю так:

V>

V>int i; V>float f=5.68; V>i=(int)f; V>

V>Возможно ли более быстро сделать данное преобразование?
V>Просто вычисления с float’ом работают раза в 2 медленнее чем с int’ом, а точность большая не нужна.
V>Дело в том что напрягает загрузка процессора, т.к. это дело в многократно вызываемом цикле.
V>Может есть какой-нить алгоритм на асме пошустрее? Или может какой-нить совет по настройкам оптимизации проекта. Интересны все предложения.
Сильно зависит от вида процессора, на x86 процессор имеет команду сохраниния float в int, при этом автоматически и бысто делает округление к ближайщему целому. Но по правилам C/C++ преобразование float в int должно выполняться с усечением. Поэтому i=(int)f выполняется отдельной библиотечной функцией, которая сохраняет режим FPU, меняет его режим округления на уселечение, сохраняет float в int и восстанавливает режим FPU. Сделать быстрее можно только через inline-assembler (будет равносильно i=(int)(f + .5)). Синтаксис зависит от компилятора, см. команды fld, fistp и fist.

V>И ещё вопрос:
V>Что быстрее

V>a=i*256; V>
V>a=i>>8; V>

Re[2]: Подскажите как быстро преобразовать float в int.

От: Voit
Дата: 29.06.06 11:29
Оценка:

Здравствуйте, Leo Yuriev, Вы писали:

LY>Здравствуйте, Voit, Вы писали:

V>>Чето не могу найти нормального решения, которое было бы быстрее чем стандарные.
V>>Я делаю так:

V>>

V>>int i; V>>float f=5.68; V>>i=(int)f; V>>

V>>Возможно ли более быстро сделать данное преобразование?
V>>Просто вычисления с float’ом работают раза в 2 медленнее чем с int’ом, а точность большая не нужна.
V>>Дело в том что напрягает загрузка процессора, т.к. это дело в многократно вызываемом цикле.
V>>Может есть какой-нить алгоритм на асме пошустрее? Или может какой-нить совет по настройкам оптимизации проекта. Интересны все предложения.
LY>Сильно зависит от вида процессора, на x86 процессор имеет команду сохраниния float в int, при этом автоматически и бысто делает округление к ближайщему целому. Но по правилам C/C++ преобразование float в int должно выполняться с усечением. Поэтому i=(int)f выполняется отдельной библиотечной функцией, которая сохраняет режим FPU, меняет его режим округления на уселечение, сохраняет float в int и восстанавливает режим FPU. Сделать быстрее можно только через inline-assembler (будет равносильно i=(int)(f + .5)). Синтаксис зависит от компилятора, см. команды fld, fistp и fist.

V>>И ещё вопрос:
V>>Что быстрее

V>>a=i*256; V>>
V>>a=i>>8; V>>

Re[3]: Подскажите как быстро преобразовать float в int.

От: ned
Дата: 29.06.06 11:46
Оценка:

Здравствуйте, Сергей Мухин, Вы писали:

S>>Сдвиг быстрей.

СМ>с какого испуга?

СМ>посмотри генерацию (при вкл оптим).

Так, так. Какой компилятор, платформа?
У меня в обоих случаях компилятор генерит сдвиг.
Команда shl выполнятся всего несколько тактов, а mul намного дольше.

Re[4]: Подскажите как быстро преобразовать float в int.

От: Sh1ZoID http://vkontakte.ru/id6263850
Дата: 29.06.06 11:59
Оценка:

Здравствуйте, ned, Вы писали:

ned>Здравствуйте, Сергей Мухин, Вы писали:

S>>>Сдвиг быстрей.

СМ>>с какого испуга?

СМ>>посмотри генерацию (при вкл оптим).

ned>У меня в обоих случаях компилятор генерит сдвиг.

Дык о том и речь

Re: Подскажите как быстро преобразовать float в int.

От: vvotan
Дата: 29.06.06 13:03
Оценка:

Здравствуйте, Voit, Вы писали:

V>Возможно ли более быстро сделать данное преобразование?

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *