2013-05-13 6 views
4

У меня есть список десятичных чисел следующим образом:Как нормализовать список положительных и отрицательных десятичного числа в определенном диапазоне

[-23.5, -12.7, -20.6, -11.3, -9.2, -4.5, 2, 8, 11, 15, 17, 21] 

мне нужно нормализовать этот список, чтобы вписаться в диапазоне [-5,5].
Как это сделать в python?

+0

Дубликат http://stackoverflow.com/questions/1969240/ map-a-range-of-values-to-another – PaulMcG

ответ

11

Чтобы получить диапазон ввода очень легко:

old_min = min(input) 
old_range = max(input) - old_min 

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

new_min = -5 
new_range = 5 + 0.9999999999 - new_min 
output = [int((n - old_min)/old_range * new_range + new_min) for n in input] 
0

Предполагая, что ваш список отсортирован:

# Rough code 
# Get the range of the list 
r = float(l[-1] - l[0]) 
# Normalize 
normal = map(lambda x: (x - l[0])/r, l) 

В принципе, вы хотите, чтобы настроить базу списка в другой диапазон. Это позволит нормализовать исходный список в [0, 1]

1
original_vals = [-23.5, -12.7, -20.6, -11.3, -9.2, -4.5, 2, 8, 11, 15, 17, 21 ] 

# get max absolute value 
original_max = max([abs(val) for val in original_vals]) 

# normalize to desired range size 
new_range_val = 5 
normalized_vals = [float(val)/original_max * new_range_val for val in original_vals] 
+2

Просто небольшая точка, вам не нужен внутренний список в 'max':' max (abs (val) для val в original_vals) 'также будет работать. –

+1

Спасибо, всегда хорошие генераторы! Я также просто понял, что последняя строка уязвима для нулевого деления, что является преимуществом для подхода на основе диапазона. – mdscruggs

2
>>> L = [-23.5, -12.7, -20.6, -11.3, -9.2, -4.5, 2, 8, 11, 15, 17, 21] 
>>> normal = map(lambda x, r=float(L[-1] - L[0]): ((x - L[0])/r)*10 - 5, L) 
>>> normal 
[-5.0, -2.5730337078651684, -4.348314606741574, -2.2584269662921352, -1.7865168539325844, -0.7303370786516856, 0.7303370786516847, 2.0786516853932575, 2.752808988764045, 3.6516853932584272, 4.101123595505618, 5.0] 
-2

Держите это просто:

>>> foo = [-23.5, -12.7, -20.6, -11.3, -9.2, -4.5, 2, 8, 11, 15, 17, 21] 
>>> [i for i in foo if int(i) in range(-5, 5)] 
[-4.5, 2] 

Кроме того, если вы хотите, чтобы результат только целые числа:

>>> [int(i) for i in foo if int(i) in range(-5, 5)] 
[-4, 2] 
+1

Это совсем не то, о чем он просит ... – Cerin

+0

@Cerin Не отрицайте, что это, вероятно, так, этот вопрос старше года, и мой ответ был до того, как был принят любой ответ или отзывы от OP. Не нужно оживлять это. – timss

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

  • Нет связанных вопросов^_^