python - 重新缩放两个数值范围之间的值

Kna*_*nak 3 python math list python-2.x rescale

我试图将包含在两个整数范围内的值转换为另一个给定范围中包含的另一个整数.我希望输出值是我的输入整数的相应值(相对于比例).为了更清楚,这里是我想要解决的问题的一个例子:

  • 假设我有三个整数,比如10,28和13,它们包含在范围(10,28)中.10是最小可能值,28是最大可能值.
  • 我希望,作为输出,整数转换为范围(5,20)中的"对应"数字.在这个精确的例子中,10将被转换为5,28到20,并且13被转换为5到20之间的值,重新调整以保持比例吸收.然后,此值将转换为整数.

如何在python中实现这种"重新缩放"?我尝试了通常的计算,(value/max of first range)*max of second range但它提供了错误的值,除非在极少数情况下.

起初我int在python中遇到了除法问题,但在纠正之后,我仍然有错误的值.例如,使用示例中给出的值int((float(10)/28)*20)将给出7作为结果,其中它应返回5,因为它是第一个范围中的最小可能值.

我觉得它有点明显(在逻辑和数学方面)我错过了一些东西.

jsb*_*eno 5

如果你得到错误的结果,你可能会使用Python2 - 其中除法总是产生一个整数 - (因此,当涉及缩放因子时,你会得到很多舍入误差和"零").

Python3更正了这一点,以便分区返回浮点数 - 在Python2中,解决方法是 from __future__ import division将代码放在代码的第一行(首选),或者在每个分区上显式地将至少一个除法操作数转换为浮点数.

from __future__ import division

def renormalize(n, range1, range2):
    delta1 = range1[1] - range1[0]
    delta2 = range2[1] - range2[0]
    return (delta2 * (n - range1[0]) / delta1) + range2[0]
Run Code Online (Sandbox Code Playgroud)