找到将浮点数列表转换为整数列表的公因子

时间:2017-06-16 11:13:18

标签: python floating-point

我有一个浮动列表来自其他一些功能。 我所知道的是,在理想世界中存在一个共同因素 可用于乘以每个项以获得整数列表。 可能会有一些小的数值噪声(~1e-14)。

所以例如

[2.3333333333333335, 4.666666666666667, 1.0, 1.6666666666666667]

这里每个术语可以乘以3来获得

[7.0, 14.0, 3.0, 5.0]

我怎样才能找到这个词?我们可以假设存在整数解。

任何有用的评论都将不胜感激

2 个答案:

答案 0 :(得分:2)

Python的Fraction类型可以将浮点数转换为分数低于1000000的有理数,然后就可以找到最小的公分母。

>>> from fractions import Fraction
>>> a = [2.3333333333333335, 4.666666666666667, 1.0, 1.6666666666666667]
>>> [Fraction(x).limit_denominator() for x in a]
[Fraction(7, 3), Fraction(14, 3), Fraction(1, 1), Fraction(5, 3)]

使用math.gcd函数找到最小公倍数的直接方法:

>>> denoms = [3,3,1,2]
>>> functools.reduce(lambda a,b: a*b//math.gcd(a,b), denoms)
6

答案 1 :(得分:0)

蛮力解决方案。还在寻找更普遍的东西......

def find_int(arr):
    test = False
    epsilon = 1e-15
    maxint = 1000
    for i in range(2, maxint, 1):
        for item in arr:
            if abs(i*item-round(i*item)) < epsilon:
                test = True
            else:
                test = False
                break
        if test:
            print i
            return [int(round(i*item)) for item in arr]
    print "Could not find one"
    return arr