2016-08-11 2 views
2

для дальнейшего объяснения моего названия: у меня есть массив поплавков, который я хочу округлить, ОДНАКО, я хочу округлить числа до числа, которое не является ближайшим целым числом. Например, предположим, что я хочу, чтобы числа округляется до ближайшего целого числа, кратного 2. Это то, что у меня есть:Как округлить поплавки до масштабируемых целых чисел?

Temp = np.around(data,0) 

с data быть массивом поплавков. Цифры округлены до ближайшего целого числа, но я хочу, чтобы они были округлены до ближайшего кратного 2. Моя цель:

0,9 -> 0

1,1 -> 2

т.д.

Спасибо!

+0

Не 1 в 2? – Jeremy

+0

Нет универсального подхода к этому, т. Е. Никакого «раунда до ближайшего числа Фибоначчи». Вы специально хотите «ближайший кратный 2» или вас интересует только ответ на общий подход? – tom10

+0

Скажем, 2 конкретно, поскольку я мог бы выяснить, как изменить его, если необходимо оттуда, @ tom10 – jstack

ответ

3

Многократная двух проста:

x = np.array([0.9, 1.1, 10.2, 7.4]) 

2*np.round(x/2) # array([ 0., 2., 10., 8.]) 

Но это не универсальный подход к этому. Например, нет obvoius «круглый к ближайшему числу Фибоначчи». Рассмотрим формулу для кратного 2, поскольку, учитывая функцию f(x)=2*x: 1) сначала примените инверсию f (разделите в этом случае), 2) затем round, 3), затем примените f. Чтобы это работало, f должен существовать, иметь обратный, и результат должен также быть int; поэтому он работает только для нескольких функций.

+0

Какой замечательный, но простой и подробный ответ. Большое спасибо, помощник, это полностью решило мою проблему! – jstack

+0

@ tom10: но многие языки имеют «округление до ближайшего ровного» (a.k.a. «округление банкира», хотя банкиры обычно так не крутятся), а кратное 2 по определению даже. Невозможно установить режим округления по умолчанию? –

+0

@ tom10, нет, видимо, нет. Вместо этого вы должны применять трюки, чтобы получить то, что хотите. –

1

Ниже один из способов сделать это:

import math 

data = [0.9, 1.1, 10.2, 7.4] 

rounded_numbers = [] 

for num in data: 

    rounded_up_num = math.ceil(num) 

    if rounded_up_num % 2 == 0: 
     rounded_num = rounded_up_num 
    else: 
     rounded_num = math.floor(num) 

    rounded_numbers.append(int(rounded_num)) 

print rounded_numbers # [0, 2, 10, 8] 
+0

Похоже на хороший подход. Однако выполнение будет быстрее, если вы только оцениваете 'math.ceil (num)' once. –

+0

хороший ответ, немного чрезмерно сложный, хотя, поскольку это привело к нескольким ошибкам, которые мне пришлось исправить. Спасибо хоть. – jstack

+0

@ChrisMueller, под редакцией :) –

Смежные вопросы