左循环numpy数组的最快方法(例如pop,push for queue)

对于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

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

以上是 左循环numpy数组的最快方法(例如pop,push for queue) 的全部内容, 来源链接: utcz.com/qa/422415.html

回到顶部