2016-04-07 2 views
0

Я работаю с np.arrays. Я пытаюсь удалить последние п элементов, где п может быть также 1.Более эффективный способ удаления последних значений N fom np.array

n=5 
corr=np.full(10,10) 

Обычно я использую этот подход массива нарезка:

corr=corr[:-n] 

Но я думал об использовании np.delete в увеличение производительности:

np.delete(corr,range(-n,0)) 

Но это не сработает, есть ли лучшее решение для сравнения с массивом? (метод, способный иметь дело также с случаем, в котором n = 0, был бы точкой преимущества)

+0

Вы хотите 'view' или' copy'? – hpaulj

+0

np.delete выделяет новый массив, который, скорее всего, медленнее, чем нарезка (также вам нужно указать положительные индексы, поэтому диапазон (5, 10) или что-то еще) yeah ... np.delete на много порядков медленнее, чем нарезка. – CookieOfFortune

+0

'delete' не работает на месте. Он возвращает новый массив. – hpaulj

ответ

3

Массив представляет собой объект с атрибутами, такими как shape, dtype, и буфер данных. Такой вид, как A[:-5], представляет собой еще один массив со своим собственным shape и т. Д., Но с общим буфером данных. Он смотрит на те же данные, но видит только срез.

A[:-5].copy() будет выглядеть одинаково, но будет иметь свой собственный буфер данных, копию выбранных элементов от A.

Невозможно изменить размер буфера данных A.

np.delete возвращает новый массив со своим собственным буфером данных. Он использует различные методы в зависимости от формы и шаблона удаления. Во всех случаях это копия и медленнее, чем нарезка.

2

Использовать corr[0:corr.size-n]. это более быстрый способ, поскольку это только представление. np.delete - это копия остаточных элементов.

In [9]: %timeit corr[0:corr.size-5] 
1000000 loops, best of 3: 1.45 µs per loop 

In [10]: %timeit np.delete(corr,range(corr.size-5,corr.size)) 
10000 loops, best of 3: 145 µs per loop 
Смежные вопросы