ソートされたnumpy配列から同じ要素を効率的にサブアレイに移動するにはどうすればよいですか?ここにnumpy配列の同一要素をサブアレイに移動する方法
import numpy as np
a=np.array([0,0,1,1,1,3,5,5,5])
:ここから
a2=array([[0, 0], [1, 1, 1], [3], [5, 5, 5]], dtype=object)
ソートされたnumpy配列から同じ要素を効率的にサブアレイに移動するにはどうすればよいですか?ここにnumpy配列の同一要素をサブアレイに移動する方法
import numpy as np
a=np.array([0,0,1,1,1,3,5,5,5])
:ここから
a2=array([[0, 0], [1, 1, 1], [3], [5, 5, 5]], dtype=object)
一つのアプローチは、数字が変化するシフトの場所を取得し、サブアレイに入力配列を分割するために、これらの指標を用いることであろう。これらの指標を見つけるために、あなたは、分化アレイ上np.nonzero
を使用することができますし、そのようにように、分割のためのnp.split
を使用 -
np.split(a,np.nonzero(np.diff(a))[0]+1)
サンプル実行 - これはitertools.groupby
を使用されるだろう行うに
In [42]: a
Out[42]: array([2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 5, 5, 6, 6, 6])
In [43]: np.split(a,np.nonzero(np.diff(a))[0]+1)
Out[43]:
[array([2, 2, 2, 2]),
array([3, 3, 3, 3]),
array([4, 4, 4, 4, 4, 4, 4]),
array([5, 5]),
array([6, 6, 6])]
一つの方法。例 -
result = np.array([list(g) for _,g in groupby(a)])
これは、numpy配列だけでなく、通常のソート済みリストでも機能します。
デモ - 他のアプローチと
In [24]: import numpy as np
In [25]: a=np.array([0,0,1,1,1,3,5,5,5])
In [26]: from itertools import groupby
In [27]: result = np.array([list(g) for _,g in groupby(a)])
In [28]: result
Out[28]: array([[0, 0], [1, 1, 1], [3], [5, 5, 5]], dtype=object)
タイミング比較 -
In [29]: %timeit np.array([list(g) for _,g in groupby(a)])
The slowest run took 6.10 times longer than the fastest. This could mean that an intermediate result is being cached
100000 loops, best of 3: 9.86 µs per loop
In [30]: %timeit np.split(a,np.where(np.diff(a)>0)[0]+1)
10000 loops, best of 3: 29.2 µs per loop
In [31]: %timeit np.array([list(g) for _,g in groupby(a)])
100000 loops, best of 3: 10.5 µs per loop
In [33]: %timeit np.split(a,np.nonzero(np.diff(a))[0]+1)
The slowest run took 4.32 times longer than the fastest. This could mean that an intermediate result is being cached
10000 loops, best of 3: 25.2 µs per loop
は常に入力配列にソート要素はありますか? – Divakar
はい、質問を更新しました。 – themachinist