猿问
下载APP

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

我正在尝试将一个数字范围转换为另一个数字,保持比率。数学不是我的强项。

我有一个图像文件,其中点值可能在-16000.00到16000.00之间,尽管典型范围可能要小得多。我想要做的是将这些值压缩到整数范围0-100,其中0是最小点的值,100是最大值的值。中间的所有点都应该保持相对比率,即使丢失了一些精度我想在python中这样做,但即使是一般算法也应该足够。我更喜欢一种算法,其中可以调整最小值/最大值或任一范围(即,第二范围可以是-50到800而不是0到100)。


慕神8447489
浏览 88回答 3
3回答

摇曳的蔷薇

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 = NewMinelse{    NewRange = (NewMax - NewMin)      NewValue = (((OldValue - OldMin) * NewRange) / OldRange) + NewMin}请注意,在这种情况下,我们不得不随意选择一个可能的新范围值。根据上下文,明智的选择可能是:NewMin(见样本),NewMax或(NewMin + NewMax) / 2

浮云间

这是一个简单的线性转换。new_value = ( (old_value - old_min) / (old_max - old_min) ) * (new_max - new_min) + new_min因此,在-16000到16000的范围内将10000转换为0到100的新范围,可以得到:old_value = 10000old_min = -16000old_max = 16000new_min = 0new_max = 100new_value = ( ( 10000 - -16000 ) / (16000 - -16000) ) * (100 - 0) + 0          = 81.25

蝴蝶刀刀

实际上有些情况下上面的答案会破裂。如错误的输入值,错误的输入范围,负输入/输出范围。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 casesprint remap( 25.0, 0.0, 100.0, 1.0, -1.0 ), "==", 0.5print remap( 25.0, 100.0, -100.0, -1.0, 1.0 ), "==", -0.25print remap( -125.0, -100.0, -200.0, 1.0, -1.0 ), "==", 0.5print remap( -125.0, -200.0, -100.0, -1.0, 1.0 ), "==", 0.5#even when value is out of boundprint remap( -20.0, 0.0, 100.0, 0.0, 1.0 ), "==", -0.2
打开App,查看更多内容
随时随地看视频慕课网APP
我要回答