Заменить 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]
Главное - НЕ удалять элементы внутри цикла, а вынести эту операцию вне него.