在Python中,如何将值映射到其他比例?
我对编程和数学比较陌生,所以如果我问这个问题的方式不对,请原谅。基本上我有一系列的日期,比如:在Python中,如何将值映射到其他比例?,python,Python,我对编程和数学比较陌生,所以如果我问这个问题的方式不对,请原谅。基本上我有一系列的日期,比如: dateList = ['1818', '1813', '1818', '1811', '1813'] 我想最终绘制这些曲线,但是为了看起来更好,plot函数需要30到80之间的值。这意味着这个集合的最小值1811应该是30,最大值1818应该是80。是否有一种编写函数fancyMap的方法,以便: fancyMap(dateList, (30, 80)) 输出类似(此处猜测): 我知道这里涉及到
dateList = ['1818', '1813', '1818', '1811', '1813']
我想最终绘制这些曲线,但是为了看起来更好,plot函数需要30到80之间的值。这意味着这个集合的最小值1811应该是30,最大值1818应该是80。是否有一种编写函数fancyMap的方法,以便:
fancyMap(dateList, (30, 80))
输出类似(此处猜测):
我知道这里涉及到一些简单的数学,但我不确定它是什么 像这样的
dateList = ['1818', '1813', '1818', '1811', '1813']
print map ( lambda x: (int(x)-1811)*(50.0/7)+30, dateList )
或
作为对Claris答案的补充,此函数适用于不同的范围:
def fancyMap(array, low, high):
array = [int(numeric_string) for numeric_string in array]
minimum = min(array)
maximum = max(array)
diff = maximum - minimum
diffScale = high - low
return map ( lambda x: int((int(x)-minimum)*(float(diffScale)/diff)+low), array)
我认为输入中的最小值将映射到传递给map函数的最小界限,对吗?在您的示例中,输出集中的1811应转换为20。也许我完全误解了你的要求。20应该是30。谢谢你注意到这一点。更正。这个概念叫做“线性插值”,但我想检查一下;你的高低论点(30,80)总是积极的吗?哦,酷。是的,它们总是正的。我想建议你动态地提取最小值和最大值,计算比例因子和偏移量,而不是硬编码。你使用
int
不起作用,它是缩放到79,而不是80。现在应该可以了。它使用diffScale/diff
进行整数除法,您也可以从uuu future\uuuu导入除法执行,以避免整数除法。
print map ( lambda x: int((int(x)-1811)*(50.0/7)+30), dateList )
def fancyMap(array, low, high):
array = [int(numeric_string) for numeric_string in array]
minimum = min(array)
maximum = max(array)
diff = maximum - minimum
diffScale = high - low
return map ( lambda x: int((int(x)-minimum)*(float(diffScale)/diff)+low), array)