1

我试图找到一种在数学运算后将数字捕捉或量化为特定值的方法,但并不真正知道解决问题的最佳方法。

一个具体的例子:

我有一个我想成为我的主号码的号码列表 - 5, 10, 30, 60, 120, 180

我有一个当前输入的数字列表 - 10、20、60、120

现在我想将所有输入的数字乘以 2,并让它们捕捉(或量化/四舍五入)最接近我的主数字。

所以像 10 这样的数字,一旦乘以 2,我想让它变成 30。我不认为这对顶部或底部来说是个大问题,因为我认为我可以使用 math.ceil 和 math.floor 来包含结束。同样,我也希望将 20 舍入为 30(20*2=40,向下舍入,因为 30 比 60 更接近)。

我看到了一个关于四舍五入到 10、100 等的类似问题,但我真的不知道如何在那里应用答案,因为我还是比较新的!:)

4

2 回答 2

3

使用bisect模块快速确定所需数量:

import bisect

def quantize(num, quant):
    mids = [(quant[i] + quant[i + 1]) / 2.0
            for i in xrange(len(quant) - 1)]
    ind = bisect.bisect_right(mids, num)
    return quant[ind]

quantnum = [5, 10, 30, 60, 120, 180]

inputnum = [10, 20, 60, 120]

for n in inputnum:
    print quantize(2 * n, quantnum)

# Output:
#30
#30
#120
#180

中点四舍五入到较大的数量;改为四舍五入到较小的那个bisect_rightbisect_left

为简单起见,此实现在mids每次调用时重新创建列表。一个有效的实现将重用中点,并以O(log n)最坏情况的复杂性运行。

于 2012-10-03T05:47:39.227 回答
2

对于元素找到与 的每个元素xinput绝对差,然后该新列表的最小值将是四舍五入的数字。x*2masterx*2

例如。对于输入列表中的 20,绝对差异列表将是:

[abs(5-40),abs(10-40),abs(30-40),abs(60-40),abs(120-40),abs(180-40)]

这导致了元素的[35,30,10,20,80,140]最小差异3rd,即列表30master

In [14]: inp=[10, 20, 60, 120,17,27,50]

In [15]: master=[5, 10, 30, 60, 120, 180]

In [16]: [min(master,key=lambda y:abs(y-x*2)) for x in inp]
Out[16]: [10, 30, 120, 180, 30, 60, 120]
于 2012-10-03T05:35:14.813 回答