重新调整数字范围,保持原始间距

时间:2013-08-06 12:34:38

标签: python

我的数字范围如下,

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

我想重新调整数字范围,因此第一项为1,最后一项为0,所有其他项目相对于原始列表保持间距。

此外,我需要列表中的所有值在最终列表中加起来为1。排除第一项。

我绝对是数学上的垃圾,所以如果有人知道如何做到这一点就是python我会非常感激......

2 个答案:

答案 0 :(得分:2)

你要求的东西是不可能的。

如果最小数字为0且最大值为1,则总和将大于1(除非所有数字相等,除了最高值)。 此外,如果您想要保持数字之间的绝对距离,您可以设置最小值或最大值,而不是两者。

但是,这里有一些可能有用的代码。如果你有一个numpy数组a

a-=np.min(a)

将最小值设置为0.

a/=np.max(a)

将最大值设置为1。

a/=np.sum(a)

将总和设置为1。

答案 1 :(得分: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.175026301236322, 0.11983500106270202, 0.0737155097520761, 0.03429371988526097, 0.0]

规范化(sum = 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 ,否则无法满足您要求的条件,因此对于您的样本数据,这是不可能的。