为了账号安全,请及时绑定邮箱和手机立即绑定

将数字范围转换为另一个范围,保持比率

将数字范围转换为另一个范围,保持比率

慕神8447489 2019-09-18 11:06:48
我正在尝试将一个数字范围转换为另一个数字,保持比率。数学不是我的强项。我有一个图像文件,其中点值可能在-16000.00到16000.00之间,尽管典型范围可能要小得多。我想要做的是将这些值压缩到整数范围0-100,其中0是最小点的值,100是最大值的值。中间的所有点都应该保持相对比率,即使丢失了一些精度我想在python中这样做,但即使是一般算法也应该足够。我更喜欢一种算法,其中可以调整最小值/最大值或任一范围(即,第二范围可以是-50到800而不是0到100)。
查看完整描述

3 回答

?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

NewValue = (((OldValue - OldMin) * (NewMax - NewMin)) / (OldMax - OldMin)) + NewMin

或者更具可读性:


OldRange = (OldMax - OldMin)  

NewRange = (NewMax - NewMin)  

NewValue = (((OldValue - OldMin) * NewRange) / OldRange) + NewMin

或者,如果要保护旧范围为0(OldMin = OldMax)的情况:


OldRange = (OldMax - OldMin)

if (OldRange == 0)

    NewValue = NewMin

else

{

    NewRange = (NewMax - NewMin)  

    NewValue = (((OldValue - OldMin) * NewRange) / OldRange) + NewMin

}

请注意,在这种情况下,我们不得不随意选择一个可能的新范围值。根据上下文,明智的选择可能是:NewMin(见样本),NewMax或(NewMin + NewMax) / 2


查看完整回答
反对 回复 2019-09-18
?
浮云间

TA贡献1829条经验 获得超4个赞

这是一个简单的线性转换。


new_value = ( (old_value - old_min) / (old_max - old_min) ) * (new_max - new_min) + new_min

因此,在-16000到16000的范围内将10000转换为0到100的新范围,可以得到:


old_value = 10000

old_min = -16000

old_max = 16000

new_min = 0

new_max = 100


new_value = ( ( 10000 - -16000 ) / (16000 - -16000) ) * (100 - 0) + 0

          = 81.25


查看完整回答
反对 回复 2019-09-18
?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

实际上有些情况下上面的答案会破裂。如错误的输入值,错误的输入范围,负输入/输出范围。


def remap( x, oMin, oMax, nMin, nMax ):


    #range check

    if oMin == oMax:

        print "Warning: Zero input range"

        return None


    if nMin == nMax:

        print "Warning: Zero output range"

        return None


    #check reversed input range

    reverseInput = False

    oldMin = min( oMin, oMax )

    oldMax = max( oMin, oMax )

    if not oldMin == oMin:

        reverseInput = True


    #check reversed output range

    reverseOutput = False   

    newMin = min( nMin, nMax )

    newMax = max( nMin, nMax )

    if not newMin == nMin :

        reverseOutput = True


    portion = (x-oldMin)*(newMax-newMin)/(oldMax-oldMin)

    if reverseInput:

        portion = (oldMax-x)*(newMax-newMin)/(oldMax-oldMin)


    result = portion + newMin

    if reverseOutput:

        result = newMax - portion


    return result


#test cases

print remap( 25.0, 0.0, 100.0, 1.0, -1.0 ), "==", 0.5

print remap( 25.0, 100.0, -100.0, -1.0, 1.0 ), "==", -0.25

print remap( -125.0, -100.0, -200.0, 1.0, -1.0 ), "==", 0.5

print remap( -125.0, -200.0, -100.0, -1.0, 1.0 ), "==", 0.5

#even when value is out of bound

print remap( -20.0, 0.0, 100.0, 0.0, 1.0 ), "==", -0.2


查看完整回答
反对 回复 2019-09-18
  • 3 回答
  • 0 关注
  • 1283 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信