Редактирование заголовка: исправлена заглавная буква и добавлено «для python».
Есть ли лучший или более стандартный способ сделать то, что я описываю?
Я хочу ввод, как это:
[1, 1, 1, 0, 2, 2, 0, 2, 2, 0, 0, 3, 3, 0, 1, 1, 1, 1, 1, 2, 2, 2]
будет преобразовано в это:
[0, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 3, 0, 0, 0, 1, 0, 0, 0, 2, 0]
или, что еще лучше, что-то вроде этого (по-разному описываем аналогичный вывод, но теперь не ограничиваясь целыми числами):
ярлыки: [1, 2, 3, 1, 2]
позиций (где 1 идентифицировал первую занятую позицию, согласно моему графику matplotlib): [2, 7, 12.5, 17, 21]
Входные данные - это категориальные данные, которые классифицируют график - на рисунке ниже сгруппированные графики имеют общую характеристику, которую я хотел бы обозначить только один раз для группы. Я буду использовать 2 оси для двух разных переменных, но я думаю, что сейчас это не так.
Примечание. Это изображение не отражает ни одного из образцов данных - оно просто помогает понять идею группировки категорий. Группа a должна быть помечена как x = 5, поскольку между первыми двумя и вторыми вертикальными группами данных есть пробел, а 0 - строка справа.
Вот что у меня есть:
data = [1, 1, 1, 2, 2, 2, 2, 2, 3, 4, 3, 2, 2, 1, 1, 1, 1]
last = None
runs = []
labels = []
run = 1
for x in data:
if x in (last, 0):
run += 1
else:
runs.append(run)
run = 1
labels.append(x)
last = x
runs.append(run)
runs.pop(0)
labels.append(x)
tick_positions = [0]
last_run = 1
for run in runs:
tick_positions.append(run/2.0+last_run/2.0+tick_positions[-1])
last_run = run
tick_positions.pop(0)
print tick_positions