巧妙地迭代整个间隔

时间:2015-07-22 20:52:15

标签: python

我使用此解决方案中的代码迭代小数点间隔:https://stackoverflow.com/a/13286671/2169327

def seq(start, end, step):
    assert(step != 0)
    sample_count = abs(end - start) / step
    return itertools.islice(itertools.count(start, step), sample_count)

但我有一个问题。我的步长约为0.001,而我的间隔为70.390829到70.855549。如何确保我实际上尽可能多地迭代?我是否应该向下舍入到三位小数,以确保我尽可能多地获得该区域?有了这个,我的意思是我需要从接近开始开始,并尽可能接近结束。那会有帮助吗?还有其他聪明的想法吗?

2 个答案:

答案 0 :(得分:3)

您可以使用numpy.linspace,它会在给定的时间间隔内返回均匀间隔的值,您只需给它三个参数,即开始,停止和步数:

numpy.linspace(70.390829, 70.855549, 464)

在此范围内使用464个样本将接近0.001的步长,但linspace将保证您的第一个和最后一个值将完全等于您的开始和结束,因此涵盖整个范围。

答案 1 :(得分:3)

由于您似乎关注使用浮点数发生的舍入错误,因此以下代码使用decimal模块允许您选择应用程序所需的精度:

>>> from decimal import Decimal as D
>>> compare = lambda a, b: (a > b) - (a < b)
>>> def drange(start, stop, step):
        relation = compare(stop, start)
        if not relation:
            raise ValueError('start and stop may not have the same value')
        if compare(relation, 0) != compare(step, 0):
            raise ValueError('step will not allow the sequence to finish')
        while True:
            yield start
            start += step
            if compare(stop, start) != relation:
                break

>>> sequence = tuple(drange(D('70.390829'), D('70.855549'), D('0.001')))
>>> len(sequence)
465

如果你不太担心浮点舍入错误,你也可以直接使用drange生成器的数字,得到一个与小数完全相同的序列:

>>> sequence = tuple(drange(70.390829, 70.855549, 0.001))
>>> len(sequence)
465