Python: Range 或 numpy Arange with end limit include

新手上路,请多包涵

我正在寻找:

输入:

 arange(0.0,0.6,0.2)

输出:

 0.,0.4

我想

0.,0.2,0.4,0.6

我如何实现使用范围或排列。如果不是什么是替代?

原文由 WPFKK 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 473
2 个回答

简而言之

我写了一个函数 crange ,它可以满足您的要求。在下面的示例中, orange 完成了 numpy.arange 的工作

crange(1, 1.3, 0.1) >>> [1.  1.1 1.2 1.3]
orange(1, 1.3, 0.1) >>> [1.  1.1 1.2]
crange(0.0, 0.6, 0.2) >>> [0.  0.2 0.4 0.6]
orange(0.0, 0.6, 0.2) >>> [0.  0.2 0.4]

背景资料

我也遇到了您的问题。我通常通过添加一个小值来快速修复它以停止。正如 Kasrâmvd 在评论中提到的,这个问题有点复杂,因为 numpy.arange 中可能会出现浮点舍入错误(参见 此处此处)。

在此示例中可以找到 意外行为

 >>> numpy.arange(1, 1.3, 0.1)
array([1. , 1.1, 1.2, 1.3])

为了让自己稍微理清头绪,如果不是特别需要,我决定停止使用 numpy.arange 。我改为使用我自己定义的函数 orange 来避免意外行为。这结合了 numpy.isclosenumpy.linspace

这是代码

够了 bla bla - 这是代码 ^^

 import numpy as np

def cust_range(*args, rtol=1e-05, atol=1e-08, include=[True, False]):
    """
    Combines numpy.arange and numpy.isclose to mimic
    open, half-open and closed intervals.
    Avoids also floating point rounding errors as with
    >>> numpy.arange(1, 1.3, 0.1)
    array([1. , 1.1, 1.2, 1.3])

    args: [start, ]stop, [step, ]
        as in numpy.arange
    rtol, atol: floats
        floating point tolerance as in numpy.isclose
    include: boolean list-like, length 2
        if start and end point are included
    """
    # process arguments
    if len(args) == 1:
        start = 0
        stop = args[0]
        step = 1
    elif len(args) == 2:
        start, stop = args
        step = 1
    else:
        assert len(args) == 3
        start, stop, step = tuple(args)

    # determine number of segments
    n = (stop-start)/step + 1

    # do rounding for n
    if np.isclose(n, np.round(n), rtol=rtol, atol=atol):
        n = np.round(n)

    # correct for start/end is exluded
    if not include[0]:
        n -= 1
        start += step
    if not include[1]:
        n -= 1
        stop -= step

    return np.linspace(start, stop, int(n))

def crange(*args, **kwargs):
    return cust_range(*args, **kwargs, include=[True, True])

def orange(*args, **kwargs):
    return cust_range(*args, **kwargs, include=[True, False])

print('crange(1, 1.3, 0.1) >>>', crange(1, 1.3, 0.1))
print('orange(1, 1.3, 0.1) >>>', orange(1, 1.3, 0.1))
print('crange(0.0, 0.6, 0.2) >>>', crange(0.0, 0.6, 0.2))
print('orange(0.0, 0.6, 0.2) >>>', orange(0.0, 0.6, 0.2))

原文由 Markus Dutschke 发布,翻译遵循 CC BY-SA 4.0 许可协议

获得所需输出的更简单方法是在上限中添加步长。例如,

 np.arange(start, end + step, step)

也将允许您包括终点。在你的情况下:

 np.arange(0.0, 0.6 + 0.2, 0.2)

会导致

array([0. , 0.2, 0.4, 0.6]).

原文由 abm17 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏