在 Python 中智能舍入数组

Smart rounding an array in Python

我想制作一个函数,将整数或浮点数均匀且智能地舍入。例如,如果我有一个像这样的数组:

[0.672, 0.678, 0.672]

我的输出是:

[0.67, 0.68, 0.67]

而且如果我有这样的输入:

[17836.982, 160293.673, 103974.287]

我的输出是:

[17836, 160293, 103974]

但与此同时,如果我的数组只有非常接近的值,例如:

[17836.987, 17836.976, 17836.953]

输出将是:

[17836.99, 17836.98, 17836.95]

一种自动化的方法可能是计算所有绝对差异,获取最小值并找出要保留的小数位数以保持代表性差异。

这并没有给出您想要的确切输出,而是遵循一般逻辑。

这里使用numpy来辅助计算,算法为O(n**2):

def auto_round(l, round_int_part=False):
    import numpy as np
    a = np.array(l)
    b = abs(a-a[:,None])
    np.fill_diagonal(b, float('inf'))
    n = int(np.ceil(-np.log10(b.min())))
    # print(f'rounding to {n} decimals') # uncomment to get info
    if n<0:
        if not round_int_part:
            return a.astype(int).tolist()
        return np.round(a, decimals=n).astype(int).tolist()
    return np.round(a, decimals=n).tolist()

auto_round([17836.987, 17836.976, 17836.953])
# [17836.99, 17836.98, 17836.95]

auto_round([0.6726, 0.6785, 0.6723])
# [0.6726, 0.6785, 0.6723]

auto_round([17836.982, 160293.673, 103974.287])
# [ 17836, 160293, 103974]

auto_round([17836.982, 160293.673, 103974.287], round_int_part=True)
# [20000, 160000, 100000]