【发布时间】:2021-07-14 22:10:05
【问题描述】:
我有一个清单 -
x= [27, 28, 29, 28, 31, 32, 29, 30, 35, 36, 33, 37, 39]
和一个范围 - (0,2000)
如何根据列表创建一个具有此范围内的值的新列表?比如 27 将是 0,而 39 将是 2000。
【问题讨论】:
标签: python python-3.x list numpy
我有一个清单 -
x= [27, 28, 29, 28, 31, 32, 29, 30, 35, 36, 33, 37, 39]
和一个范围 - (0,2000)
如何根据列表创建一个具有此范围内的值的新列表?比如 27 将是 0,而 39 将是 2000。
【问题讨论】:
标签: python python-3.x list numpy
x = [27, 28, 29, 28, 31, 32, 29, 30, 35, 36, 33, 37, 39]
r = (0, 2000)
lower = min(x)
upper = max(x)
print ([(i - lower) * ((r[1] - r[0]) / (upper - lower)) + r[0] for i in x])
如果您想要整数值而不是浮点数,请在列表推导中插入 int() 或 round()。
编辑:我更改了代码以提供更通用的解决方案,该解决方案也适用于 (0, 2000) 之外的其他范围。
【讨论】:
你标记了 numpy,所以这里有一个使用它的答案:
>>> import numpy as np
>>> x = np.array([27, 28, 29, 28, 31, 32, 29, 30, 35, 36, 33, 37, 39])
>>> 2000 * (x - x.min()) / (x.max() - x.min())
array([ 0. , 166.66666667, 333.33333333, 166.66666667,
666.66666667, 833.33333333, 333.33333333, 500. ,
1333.33333333, 1500. , 1000. , 1666.66666667,
2000. ])
【讨论】:
[[27, 28, 29, 28],[28,30,32,29],[31,32,28,33]] 这样的 numpy 数组,希望保留相同的结构,但值在该范围内
np.interp(x, (x.min(), x.max()), (0, 2000))
这是一种解决方案:
>>> x = [27, 28, 29, 28, 31, 32, 29, 30, 35, 36, 33, 37, 39]
>>> y = [i* 2000/(len(x)-1) for i in range(len(x))]
>>> print(y)
>>> [0.0, 166.66666666666666, 333.3333333333333, 500.0, 666.6666666666666, 833.3333333333334, 1000.0, 1166.6666666666667, 1333.3333333333333, 1500.0, 1666.6666666666667, 1833.3333333333333, 2000.0]
【讨论】:
您可以使用list comprehension、min 和len:
>>[(i-min(x))*2000/(len(x)-1) for i in x]
[0.0, 166.66666666666666, 333.3333333333333, 166.66666666666666, 666.6666666666666, 833.3333333333334, 333.3333333333333, 500.0, 1333.3333333333333, 1500.0, 1000.0, 1666.6666666666667, 2000.0]
【讨论】: