Большинство pythoni c способ нахождения «фазы» (процент «завершения» или относительной позиции в чанке) двоичного вектора - PullRequest
0 голосов
/ 24 февраля 2020

Скажем, у меня есть двоичный вектор, представляющий две фазы:

signal = np.array([0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1])

Я хотел бы вычислить для каждого значения этого вектора его "позицию" относительно его порции, выраженную, например, в процентах, таких как:

желаемый результат :

[0, 0.33, 0.66, 0.99, 
 0, 0.5, 1, 
 0, 1, 
 0, 0.33, 0.66, 0.99]

Интересно, какой самый эффективный или pythoni c способ получить это. Одним из способов было бы l oop туда-сюда и вычислить длину каждой «фазы» и соответственно разделить индекс, но это кажется довольно запутанным?

Спасибо большое:)

1 Ответ

2 голосов
/ 24 февраля 2020

Нет ничего непонятного в Pythoni c в написании циклов, но если вы абсолютно обязаны делать все с пониманиями и itertools, вот один из способов:

import numpy as np
from itertools import chain, groupby

signal = np.array([0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1])

result = list(chain.from_iterable(
    np.linspace(0, 1, sum(1 for _ in v))
    for _, v in groupby(signal)
))

Результат ( выполните собственное округление, если это действительно необходимо):

[0.0, 0.3333333333333333, 0.6666666666666666, 1.0,
 0.0, 0.5, 1.0,
 0.0, 1.0,
 0.0, 0.3333333333333333, 0.6666666666666666, 1.0]

Объяснение:

  • groupby(signal) группирует смежные последовательности из 0 или 1,
  • sum(1 for _ in v) получает длину текущей последовательности,
  • np.linspace(0, 1, ...) создает массив этой длины, содержащий равномерно расположенные числа от 0 до 1,
  • list(chain.from_iterable(...)) объединяет эти массивы вместе в список .
...