使用 numpy 数组,我想执行此操作:

  • x[1],...,x[n-1] 移动到 x[0],...,x[n-2](左移),
  • 在最后一个索引中写入一个新值: x[n-1] = newvalue

  • 这类似于先进后出队列的 pop()push(newvalue) (仅反转)。

    一个简单的实现是: x[:-1] = x[1:]; x[-1] = newvalue

    另一种使用 np.concatenate 的实现速度较慢: np.concatenate((x[1:], np.array(newvalue).reshape(1,)), axis=0)

    有没有最快的方法来做到这一点?

    最佳答案

    经过一些实验,很明显:

  • 需要复制,
  • 以及最快和最简单的方法,对于 nparray(numpy 数组)是切片和复制。

  • 所以解决方案是: x[:-1] = x[1:]; x[-1] = newvalue

    这是一个小基准:
    >>> x = np.random.randint(0, 1e6, 10**8); newvalue = -100
    >>> %timeit x[:-1] = x[1:]; x[-1] = newvalue
    1000 loops, best of 3: 73.6 ms per loop
    >>> %timeit np.concatenate((x[1:], np.array(newvalue).reshape(1,)), axis=0)
    1 loop, best of 3: 339 ms per loop
    

    但是如果你不需要快速访问数组中的所有值,而只需要第一个或最后一个,使用 deque 更聪明。

    关于python - 左循环 numpy 数组的最快方法(如弹出、推送队列),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42771110/

    10-16 22:21