передискретизація кожного n-го запису в масиві numpy


95

Я новачок у numpy, і намагаюся витягти деякі дані з довгого масиву numpy. Що мені потрібно зробити, це почати з визначеної позиції в моєму масиві, а потім подати вибірку кожної n-ї точки даних із цієї позиції до кінця мого масиву.

в основному, якби я мав

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

Я хочу подати a[1]вибірку для початку, а потім взяти кожну четверту точку звідти, щоб отримати щось подібне

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

Відповіді:


162

Ви можете використовувати нарізку 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
дякую за попередження щодо копії посилання / значення. інакше я точно потрапив би в пастку
назавжди
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.