社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python中数组的智能取整

Stochastic_reubeu • 3 年前 • 1266 次点击  

我想做一个函数,对整数或浮点进行均匀和智能的舍入。例如,如果我有如下数组:

[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]
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/128237
 
1266 次点击  
文章 [ 1 ]  |  最新文章 3 年前
mozway
Reply   •   1 楼
mozway    3 年前

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

这不会给出您想要的确切输出,但遵循一般逻辑。

这里使用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]