2013-08-06 2 views
-4

У меня есть диапазон номеров следующим образом,диапазона номера Rescale который держит Orginal интервала

[0.31622776601683794, 0.26591479484724945, 0.24028114141347545, 0.22360679774997896, 
0.21147425268811282, 0.20205155046766235, 0.19441308418139638, 0.1880301546543197, 
0.18257418583505536, 0.17782794100389226] 

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

Также мне нужно, чтобы все значения в списке добавлялись до 1 в конечном списке. Исключая первый элемент.

Я абсолютно мусор в математике, так что если кто-нибудь знает, как сделать, чтобы это питон я был бы очень благодарен ...

+0

Итак, каков ожидаемый результат для вашего примера? – arshajii

+2

Если первый элемент равен 1, и вы хотите, чтобы сумма всех элементов равнялась 1, вам нужно '[1,0, 0, 0, ..., 0]'. –

+0

@AshwiniChaudhary как насчет [1, -1, 1, 0 ...]? ;) –

ответ

1

Вычитайте last из всех и разделите все на first.

emil ~ > python 
Python 2.7.1 (r271:86832, Aug 5 2011, 03:30:24) 
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin 
Type "help", "copyright", "credits" or "license" for more information. 
>>> l = [0.31622776601683794, 0.26591479484724945, 0.24028114141347545, 0.22360679774997896, 
... 0.21147425268811282, 0.20205155046766235, 0.19441308418139638, 0.1880301546543197, 
... 0.18257418583505536, 0.17782794100389226] 
>>> l 
[0.31622776601683794, 0.26591479484724945, 0.24028114141347545, 0.22360679774997896, 0.21147425268811282, 0.20205155046766235, 0.19441308418139638, 0.1880301546543197, 0.18257418583505536, 0.17782794100389226] 
>>> len(l) 
10 
>>> l1 = [] 
>>> l1[:] = [x - l[9] for x in l] 
>>> l1 
[0.13839982501294568, 0.08808685384335718, 0.06245320040958319, 0.0457788567460867, 0.03364631168422055, 0.024223609463770085, 0.01658514317750412, 0.010202213650427422, 0.004746244831163093, 0.0] 
>>> l2 = [] 
>>> l2[:] = [x/l1[0] for x in l1] 
>>> l2 
[1.0, 0.6364665116817719, 0.4512520185899182, 0.33077250453029566, 0.2431094958470745, 0.1750263, 0.11983500106270202, 0.0737155097520761, 0.03429371988526097, 0.0] 

И нормализуют (сумма = 1):

>>> l3 = [] 
>>> l3[:] = [x/sum(l2) for x in l2] 
>>> l3 
[0.3263205883093977, 0.20769212653122596, 0.14725282418206537, 0.107937878274899, 0.07933163370841843, 0.05711468558905446, 0.03910462804683822, 0.024054888509824617, 0.01119074684827605, 0.0] 

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

+0

безупречное спасибо !!!!! – Jim

2

Вы просите что-то, что невозможно.

Если минимальное число равно 0, а max равно 1, тогда сумма будет больше 1 (если все числа не будут равны, кроме самого высокого). Кроме того, если вы хотите сохранить абсолютные расстояния между цифрами, вы можете установить либо минимальный, либо максимальный, а не оба.

Однако, вот какой код может помочь. Если у вас есть Numpy массив a:

a-=np.min(a) 

установит минимум равным 0.

И:

a/=np.max(a) 

установит максимум до 1.

И:

a/=np.sum(a) 

установит сумму в 1.

+0

@arshajii 'a/= np.sum (a)' даст сумму точно 1. – Bitwise

+0

@arshajii спасибо, теперь я обратился к нечетному случаю в своем ответе. – Bitwise

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