subsampling setiap entri ke-n dalam array numpy

95

Saya seorang pemula dengan numpy, dan saya mencoba mengekstrak beberapa data dari array numpy yang panjang. Yang perlu saya lakukan adalah mulai dari posisi yang ditentukan dalam array saya, dan kemudian mensubsampel setiap titik data ke-n dari posisi itu, hingga akhir array saya.

pada dasarnya jika saya punya

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

Saya ingin membuat sub-sampel ini untuk memulai a[1]dan kemudian mengambil sampel setiap poin keempat dari sana, untuk menghasilkan sesuatu seperti

b = [2,2,2.....]
Rich Williams
sumber

Jawaban:

162

Anda bisa menggunakan irisan numpy dengan mudah start:stop:step.

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

Ini membuat tampilan dari data asli, jadi waktunya konstan . Ini juga akan mencerminkan perubahan pada larik asli dan menyimpan seluruh larik asli dalam memori:

>>> 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])

jadi jika salah satu hal di atas menjadi masalah, Anda dapat membuat salinannya secara eksplisit:

>>> 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])

Ini bukan waktu yang konstan, tetapi hasilnya tidak terkait dengan larik asli. Salinan juga berdekatan dalam memori, yang dapat membuat beberapa operasi lebih cepat.

behzad.nouri
sumber
1
terima kasih atas peringatannya tentang salinan referensi / nilai. jika tidak saya pasti akan jatuh ke dalam perangkap
Selamanya