web-dev-qa-db-ja.com

numpy配列を左サイクルする最も速い方法(pop、Push for a 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)

それを行うための最速の方法はありますか?

10
Næreen

いくつかの実験の後、それは明らかです:

  • コピーが必要です、
  • 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 を使用する方が賢明です。

12
Næreen