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

の要素についてと の各要素との絶対差を見つけるxと、その新しいリストの最小値が丸められた数値になります。inputx*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]最小の差が生じました3rd30master

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 に答える