以最快的方式向左循环numpy数组(如pop,push for a queue)

2024-05-16 10:38:39 发布

您现在位置:Python中文网/ 问答频道 /正文

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

有最快的方法吗?


Tags: 方法numpy队列np数组arraypoppush
1条回答
网友
1楼 · 发布于 2024-05-16 10:38:39

经过一些实验,很明显:

  • 需要复制
  • 对于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

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

相关问题 更多 >