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

Ric*_*nop 8 python

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

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

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

Mar*_*ers 22

使用线性映射:

y = ((x / 99.0) * 2) - 1
Run Code Online (Sandbox Code Playgroud)

这个怎么运作:

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

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


Gle*_*ard 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))
Run Code Online (Sandbox Code Playgroud)

我发现这是任何语言中更有用的函数之一; 你可以一目了然地看出scale()调用的作用.


Dar*_*ary 9

使用numpy,这将是最有效的

>>> from numpy import interp
>>> interp(50, [0,99], [-1,1])
0.010101010101010166
Run Code Online (Sandbox Code Playgroud)


ang*_*son 8

要映射x此范围中的值:

[a..b]
Run Code Online (Sandbox Code Playgroud)

在此范围内:

[a'..b']
Run Code Online (Sandbox Code Playgroud)

你使用这个公式:

x' = (x / 99) * 2 - 1
Run Code Online (Sandbox Code Playgroud)

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

x' = ((x - a) / (b - a)) * (b' - a') + a'
Run Code Online (Sandbox Code Playgroud)

一步步:

  1. 你先计算出多远成比例a..bx就是价值:

    (x - a) / (b - a)
    
    Run Code Online (Sandbox Code Playgroud)

    该值介于0和1之间.

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

    ratio * (b' - a') + a'
    
    Run Code Online (Sandbox Code Playgroud)

在您的特定情况下:

x' = ((x - 0) / (99 - 0)) * (1.0 - (-1.0)) + (-1.0)
Run Code Online (Sandbox Code Playgroud)

或以简约形式:

x' = (x / 99) * 2 - 1
Run Code Online (Sandbox Code Playgroud)

注意:如果您在编程语言中执行此操作,其中整数除以另一个整数是整数除法,则应将值提升为浮点以避免必须处理精度损失:

x' = (x / 99.0) * 2.0 - 1.0
Run Code Online (Sandbox Code Playgroud)


Pwd*_*wdr 5

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

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

mappedValue = minTo + (maxTo - minTo) * ((value - minFrom) / (maxFrom - minFrom));
Run Code Online (Sandbox Code Playgroud)