【问题标题】:numpy arange with specific gaps [duplicate]具有特定间隙的numpy范围[重复]
【发布时间】:2018-07-03 18:52:49
【问题描述】:

在 python3.x 中有没有更干净更好的方法来做

a = np.arange(1,4)
b = np.arange(5,10)
c = np.concatenate((a,b))

?所以结果是c = [1,2,3,5,6,7,8,9,10] 请注意,此示例中选择的数字是任意的!

【问题讨论】:

标签: python arrays python-3.x numpy


【解决方案1】:

使用numpy.r_ 对象。

c = np.r_[1:4, 5:10]

我觉得以前可能有人问过这个问题

【讨论】:

    【解决方案2】:

    np.delete 似乎比np.r_ 快一点:

    >>> from timeit import repeat
    >>> import numpy as np
    >>> 
    >>> min(repeat('np.r_[1:4, 5:10]', globals=globals(), number=100000))
    1.2129063629545271
    >>> min(repeat('np.delete(np.arange(1, 10), 4)', globals=globals(), number=100000))
    0.6783314400818199
    

    ...但不如 OP 的串联速度快

    >>> min(repeat('np.concatenate((np.arange(1, 4), np.arange(5, 10)))', globals=globals(), number=100000))
    0.1798924310132861
    

    【讨论】:

    • 讽刺的是,我认为最差的解决方案表现最好
    • r_ 很漂亮,但是开销很大;它真的是语法糖。它在内部使用arangeconcatenate。更多关于r_这里stackoverflow.com/questions/37743843/…
    【解决方案3】:

    根据您的具体用例,这样的事情也可以解决您的问题:

    np.array([ x + (x>3) for x in range(1,9) ])
    

    或者在纯 numpy 中:

    a = np.arange(1, 9)
    a += (a>3)  # or similar
    

    但我只是为了完整起见才提到这一点。我很难想出一个好的解决方案。当然不是在一些奇怪而艰难的优化步骤之前。

    但请记住,这种方法更通用,也可以用于比 (a>3) 更复杂的计算。

    【讨论】:

      【解决方案4】:

      不是真的。使用一点信息论...

      您在这里有两个独立的想法:序列和排除。当然,您可以编造一个多项式以相等的间隔显示这些值,但这不会更简单。

      这很容易简化为以下两种解决方案之一:连接各个连续序列(您的帖子),或构建完整范围,但在使用前删除排除项。你可以用更短的符号来做,但没有什么在所有方面都“更好”。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-13
        • 1970-01-01
        • 2017-11-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多