左循环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