在 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]
我想制作一个函数,将整数或浮点数均匀且智能地舍入。例如,如果我有一个像这样的数组:
[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]