Составьте список, если заявление основано на предыдущем элементе - PullRequest
0 голосов
/ 28 марта 2020

У меня есть следующее

U = np.array([1., 0., 0., 1., 0., 0., 1., 0., 1., 0.])
c = iter(range(2, len(U)))
result = [float(next(c)) if x == 1 else x for x in U]

Это дает
[2.0, 0.0, 0.0, 3.0, 0.0, 0.0, 4.0, 5.0, 6.0, 0.0] Однако я хочу, чтобы, когда элемент слева обозначал число, то, что "l oop" on становится той же меткой.

Итак, это [2.0, 0.0, 0.0, 3.0, 0.0, 0.0, 4.0, 4.0, 4.0, 0.0]

for-l oop, которое описывает это следующим образом:

U=np.array([1., 0., 0., 1., 1., 0., 1., 1., 1.])
l=2
for i in range(len(U[:])):  
    i+1                       #for simplicity I skipped the first one
    if U[i]==1:
        if U[i-1]!=0:
            U[i]=U[i-1]
        else:
            U[i]=l
            l+=1

Возвращает

array([1., 0., 0., 2., 2., 0., 3., 3., 3.])

1 Ответ

0 голосов
/ 28 марта 2020

Итак, что же делать с выводом result:

  • сохранить 0, если ввод 0
  • сохранить первое значение c, если ввод 1
  • продвижение c, если входные данные переходят от 1 к 0 (спадающий фронт)

Как и в python, мы не можем проверить первый элемент итератора, поэтому нам нужно чтобы сделать это в список или любую другую структуру данных, которая поддерживает это. Чтобы решить, есть ли у нас упавший край, нам нужно иметь доступ к двум последовательным элементам за одну итерацию.

Вот решение без понимания списка. Обратите внимание, что вы преобразуете все в понимание списка, если вы не сохраняете промежуточные значения.

import numpy as np
import itertools

U = np.array([1., 0., 0., 1., 1., 0., 1., 1., 1.])
c = list(range(1, len(U)))

R = []
for U_curr, U_next in itertools.zip_longest(U, U[1:], fillvalue=0):
    if U_curr == 0:
        res.append(0)
    else:
        if U_curr == 1 and U_next == 0:
            val = c.pop(0)
        else:
            val = c[0]
        R.append(float(val))

Здесь приведено выше в понимании списка:

U = np.array([1., 0., 0., 1., 1., 0., 1., 1., 1.])
c = list(range(1, len(U)))

R = [float(c.pop(0) if U_curr == 1 and U_next == 0 else c[0]) if U_curr != 0 else 0
     for U_curr, U_next in itertools.zip_longest(U, U[1:], fillvalue=0)]

Оба будут выводить

[1.0, 0, 0, 2.0, 2.0, 0, 3.0, 3.0, 3.0]
...