Допустим, у меня есть машина, которая отправляет 4 бита каждую секунду, и я хочу увидеть, сколько раз определенная битовая сигнатура отправляется за какое-то время.
Мне дан входной список списков, которые содержат сообщения в битах, которые со временем меняются.
Для вывода я хотел бы получить список словарей для каждой пары бит, содержащий уникальную пару битов в качестве ключа и время, в которое он отображается в качестве значения.
Редактировать новый пример:
Например, этот следующий набор данных будет представлять эти данные. С горизонтальной осью, являющейся позицией бита, и вертикальной осью, являющейся выборками во времени. Так что для следующего примера у меня есть 4 полных бита и 6 полных выборок.
a = [
[0, 0, 1, 1],
[0, 1, 1, 1],
[1, 1, 1, 1],
[1, 1, 1, 1],
[0, 0, 0, 0],
[1, 0, 1, 0]])
Для этого набора данных я пытаюсь подсчитать, сколько раз встречается определенная битовая строка, эта длина должна быть в состоянии варьироваться, но для этого примера, скажем, я делаю 2 бита за раз.
Таким образом, первая выборка [0,0,1,1] будет разбита на эту
[00,01,11] и второй будет [01,11,11], а третий будет [11,11,11] и так далее. Составить список примерно так:
y = [
[00,01,11],
[01,11,11],
[11,11,11],
[11,11,11],
[00,00,00],
[10,01,10]]
Исходя из этого, я хочу иметь возможность подсчитывать каждую уникальную подпись и создавать словарь с ключами, соответствующими подписи, и значениями для подсчетов.
Словарь хотел бы это
z = [
{'00':2, '01':1, '11':2, '10':1},
{'00':1, '01':2, '11':3},
{'00':1, '11':4], '10':1}]
Найти количество легко, если есть список проанализированных элементов. Однако при получении необработанных данных в этот разобранный список у меня возникли некоторые проблемы. У меня есть реализация, но по сути это 3 для циклов, и она работает очень медленно на большом наборе данных. Конечно, есть лучший и более питонный способ обойти это?
Я использую numpy для некоторых дополнительных вычислений позже в моей программе, поэтому я не буду против использовать его здесь.
UPDATE:
Я смотрел вокруг на другие вещи и пришел к этому. Не уверен, что это лучшее решение.
import numpy as np
a = np.array([
[0, 0, 1, 1],
[0, 1, 1, 1],
[1, 1, 1, 1]])
my_list = a.astype(str).tolist()
# How many elements each
# list should have
n = 2
# using list comprehension
final = [([''.join(c[i:(i) + n]) for i in range((len(c) + n) // n)]) for c in my_list]
final = [['00', '01', '11'], ['01', '11', '11'], ['11', '11', '11']]
ОБНОВЛЕНИЕ 2:
Я запустил следующие реализации и протестировал там скорости, и вот что я придумал.
Выполнение данных на небольшом примере из 4 битов и 4 выборок шириной 2.
x = [
[0,0,1,1],
[0,1,1,1],
[1,1,1,1]]
Моя реализация заняла 0,0003 секунды
Реализация Kasrâmvd заняла 0,0002 секунды
Реализация Криса заняла 0,0002 секунды
Реализация Павла заняла 0,0243 секунды
Однако при работе с фактическим набором данных из 64 бит и 23 497 выборок с шириной 2. Я получил следующие результаты:
Моя реализация заняла 1,5302 секунды
Реализация Kasrâmvd заняла 0,3913 секунд
Реализация Криса заняла 2,0802 секунды
Реализация Павла заняла 0,0204 секунды