如何映射范围< 0; 99>范围内的数字范围< -1.0; 1.0>?

时间:2010-11-11 13:38:27

标签: python

所以我有一个函数总是返回范围< 0; 99>的数字。 (即0,1,... 99 - 整数)。

将这些数字正确映射到范围< -1.0; 1.0>的最佳方法是什么?

0当然是-1.0而99则是1.0。如何计算?之间的数字?

6 个答案:

答案 0 :(得分:22)

使用线性映射:

y = ((x / 99.0) * 2) - 1

工作原理:

  • 除以99:这将范围从[0,99]标准化为[0,1]。
  • 乘以2:这会将范围增加到[0,2]。
  • 减1:这是一个给出[-1,1]的翻译。

如果您愿意,您当然可以将步骤((x / 99.0)* 2)组合成一个部门。为了清楚起见,我把它拆开了。

答案 1 :(得分:18)

不要手动缩放;在计算出真正意图的数学时,需要花太多时间眯着眼睛看。使用辅助函数。

def scale(val, src, dst):
    """
    Scale the given value from the scale of src to the scale of dst.
    """
    return ((val - src[0]) / (src[1]-src[0])) * (dst[1]-dst[0]) + dst[0]

print scale(0, (0.0, 99.0), (-1.0, +1.0))
print scale(1, (0.0, 99.0), (-1.0, +1.0))
print scale(99, (0.0, 99.0), (-1.0, +1.0))

我发现这是任何语言中更有用的功能之一;你可以一眼就看出scale()调用的作用。

答案 2 :(得分:7)

从此范围映射值x

[a..b]

到此范围:

[a'..b']

您使用此公式:

x' = (x / 99) * 2 - 1

这种映射的工作方式如下:

x' = ((x - a) / (b - a)) * (b' - a') + a'

一步一步:

  1. 您首先计算a..bx的距离比率:

    (x - a) / (b - a)
    

    此值介于0和1之间。

  2. 然后使用此值计算该值应该在a'..b'的距离:

    ratio * (b' - a') + a'
    
  3. 在您的特定情况下:

    x' = ((x - 0) / (99 - 0)) * (1.0 - (-1.0)) + (-1.0)
    

    或以简约形式:

    x' = (x / 99) * 2 - 1
    

    注意:如果你在一个编程语言中这样做,其中整数除以另一个整数是整数除法,你应该将值提升到浮点,以避免不得不处理精度损失:

    x' = (x / 99.0) * 2.0 - 1.0
    

答案 3 :(得分:3)

将此用于任何范围(也可以为负数)。

[minFrom..maxFrom] - > [minTo..maxTo]

mappedValue = minTo + (maxTo - minTo) * ((value - minFrom) / (maxFrom - minFrom));

答案 4 :(得分:2)

使用numpy,这将是最有效的

>>> from numpy import interp
>>> interp(50, [0,99], [-1,1])
0.010101010101010166

答案 5 :(得分:-1)

n = (n / 99) * 2 - 1;