Как отфильтровать массив NumPy в зависимости от каждой записи и ее предыдущей записи - PullRequest
0 голосов
/ 08 ноября 2019

Я собираюсь преобразовать свой код для работы с NumPy, и у меня есть следующая функция:

def Clean_One_State(ListsToConvert):
    # Removes duplicate states
    prev_bool = 2
    returnlist = []
    for value in enumerate(ListsToConvert[1:], 0):
        if value[1] != prev_bool:
            try:
                returnlist.append(value)
                prev_bool = value[1]
            except IndexError:
                returnlist.append(value)
                prev_bool = value[1]
    return returnlist

В предложении функция удаляет записи во входе, которые имеют то же состояние, что и предыдущая запись,Для ваших собственных нужд ввод и вывод функции:

In:[['Event Time', 'State at A'],[0.0, 1], [0.03253, 1], [0.04757, 0], 
    [0.08479, 0], [0.98534, 1], [0.98748, 1], [1.03602, 0], [1.03717, 0],
    [1.95898, 0], [1.96456, 1], [2.00913, 1], [2.01547, 0]...
Out: [[0.0, 1], [0.04757, 0], [0.98534, 1], [1.03602, 0], [1.96456, 1], [2.01547, 0]...

В идеале я хочу иметь возможность получить представление о списке ввода (в NumPy), чтобы я мог удалять записи в списке выводаэто повлияет на список ввода. Я посмотрел примеры в Интернете, но я все еще застрял на том, как это сделать.

1 Ответ

1 голос
/ 08 ноября 2019

Довольно стандартным способом NumPy было бы использовать расширенную индексацию:

data = [['Event Time', 'State at A'],[0.0, 1], [0.03253, 1], [0.04757, 0], 
        [0.08479, 0], [0.98534, 1], [0.98748, 1], [1.03602, 0], [1.03717, 0],
        [1.95898, 0], [1.96456, 1], [2.00913, 1], [2.01547, 0]]

# convert to array
ar = np.array([*map(tuple,data[1:])],dtype=[*zip(data[0],(float,int))])
ar
# array([(0.     , 1), (0.03253, 1), (0.04757, 0), (0.08479, 0),
#        (0.98534, 1), (0.98748, 1), (1.03602, 0), (1.03717, 0),
#        (1.95898, 0), (1.96456, 1), (2.00913, 1), (2.01547, 0)],
#       dtype=[('Event Time', '<f8'), ('State at A', '<i8')])

# find places where State at A changes and select them from ar
# prepend something that is not equal to the first State at A, so the 
# very first item is also selected
ar[np.diff(ar['State at A'],prepend=ar['State at A'][0]-1).nonzero()]
# array([(0.     , 1), (0.04757, 0), (0.98534, 1), (1.03602, 0),
#        (1.96456, 1), (2.01547, 0)],
#       dtype=[('Event Time', '<f8'), ('State at A', '<i8')])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...