Заменить for цикл по массиву на numpy без цикла

Как в этом коде убрать цикл и заменить его на numpy ?

def decrypt(data):
    sizepacket = len(data)
    if(data[len(data)-1] == 0xFF and data[len(data)-2] == 0xFF):
        data.pop(sizepacket-1)
        data.pop(sizepacket-2)
        sizepacket = len(data)
    for i in range(sizepacket-1):
        if(data[i] == 0xFF and data[i+1] == 0x0):
            data.pop(i+1)
    return xor(data)

Ответы (2 шт):

Автор решения: GrAnd

Как вариант:

import numpy as np
data = np.array(....)

# находим индексы элементов равных 0xFF и смещаемся на следующий элемент
indexes = np.where(data[:-1] == 0xFF)[0] + 1

# оставляем только индексы где значение равно 0
to_remove = indexes[data[indexes] == 0]

# удаляем все найденные элементы по их индексам
result = np.delete(data, to_remove)
→ Ссылка
Автор решения: passant

Вообще-то я очень сильно не уверен, что переход на numpy именно в данном случае даст какой-нибудь эффект. Я уже не говорю, про необходимость преобразования списка к numpy-массиву. Но если очень хочется - та вариантов может быть несколько:

Раз:

import numpy as np
data =[0x02,0xFF,0x01,0xFF,0x0,0x0,0xFF,0x02,0xFF,0x0,0x02]
np_data=np.array(data)
mask = np.ones(len(np_data), dtype=bool)
for i in range(len(np_data)-1):
    if np_data[i] == 0xFF and np_data[i+1] == 0x0:
        mask[i+1]=False
result = np_data[mask]
print (result)

Два:

mask1=[]
for i in range(len(np_data)-1):
    if np_data[i] == 0xFF and np_data[i+1] == 0x0:
        mask1.append(i+1)
result1 = np.delete(np_data,mask1)

Естественно, что в обоих случаях результат тождественный:

[  2 255   1 255   0 255   2 255   2]

Главное - НЕ удалять элементы внутри цикла, а вынести эту операцию вне него.

→ Ссылка