numpy配列のn番目ごとのエントリをサブサンプリングする


93

私はnumpyの初心者であり、長いnumpy配列からデータを抽出しようとしています。私がする必要があるのは、配列内の定義された位置から開始し、その位置から配列の最後まで、n番目ごとのデータポイントをサブサンプリングすることです。

基本的には

a = [1,2,3,4,1,2,3,4,1,2,3,4....] 

これをサブサンプリングして開始しa[1]、そこから4ポイントごとにサンプリングして、次のようなものを生成したい

b = [2,2,2.....]

回答:


154

単純にnumpyのスライスを使用できますstart:stop:step

>>> xs
array([1, 2, 3, 4, 1, 2, 3, 4, 1, 2, 3, 4])
>>> xs[1::4]
array([2, 2, 2])

これにより、元のデータのビューが作成されるため、時間は一定になります。また、元の配列への変更を反映し、元の配列全体をメモリに保持します。

>>> a
array([1, 2, 3, 4, 5])
>>> b = a[::2]         # O(1), constant time
>>> b[:] = 0           # modifying the view changes original array
>>> a                  # original array is modified
array([0, 2, 0, 4, 0])

したがって、上記のいずれかに問題がある場合は、明示的にコピーを作成できます。

>>> a
array([1, 2, 3, 4, 5])
>>> b = a[::2].copy()  # explicit copy, O(n)
>>> b[:] = 0           # modifying the copy
>>> a                  # original is intact
array([1, 2, 3, 4, 5])

これは一定の時間ではありませんが、結果は元の配列に関連付けられていません。コピーはメモリ内でも連続しているため、一部の操作が高速になります。


1
参照/値のコピーに関する警告をありがとうございます。そうでなければ間違いなく罠に陥るだろう
Chris
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.