【问题标题】:python - rescale a value between two numerical rangespython - 重新调整两个数值范围之间的值
【发布时间】:2016-05-22 09:26:39
【问题描述】:

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

  • 假设我有三个整数,比如 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,但它给出了错误的值,除非在极少数情况下。

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

我觉得这有点明显(在逻辑和数学方面),我遗漏了一些东西。

【问题讨论】:

  • 这种情况下的预期结果是什么?您能否给出更正式的规范,或者至少提供一些示例(带有预期输出)?
  • 我添加了信息,所以问题应该更容易理解。

标签: python list math python-2.x rescale


【解决方案1】:

如果您得到错误的结果,您可能使用的是 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]

【讨论】:

  • 很好,非常感谢。我的问题确实是由于转换为浮点数(并且我的重新缩放公式不够完整)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多