Как определить среднее значение по индексам в массиве на основе уникальных идентификаторов

#python #arrays #numpy #series

#питон #массивы #тупица #Серии

Вопрос:

У меня есть полный массив временных рядов (назовем его ts ), который представляет собой (числовой) массив измерений (240, 60, 64) , представляющий 240 временных рядов по 60 точек для 64 каналов. Затем логическая серия pandas для выбора временных событий (назовем ее events так ), которая при применении ts будет выбирать только хорошие моменты во временной серии. Наконец, у меня есть уникальный идентификатор ( ids ) для каждого события, чтобы разделить их на несколько групп. (В серии уже была проведена некоторая предварительная обработка, поэтому индексы не переходят от 0 к len(ts) )

 gt;gt;gt; ts.shape  (240, 60, 64)  gt;gt;gt; events 36 False 42 False 48 False 54 False 60 True  ...  2064 False 2073 False 2080 False 2086 False 2092 True Length: 240, dtype: bool  gt;gt;gt; ids 36 1 42 1 48 1 54 1 60 1  .. 2064 20 2073 20 2080 20 2086 20 2092 20 Length: 240, dtype: int32  gt;gt;gt; foo = ids.loc[events] gt;gt;gt; foo 60 1 84 1 190 2 202 2 302 3  ... 1778 17 1884 18 1934 19 1986 19 2092 20 Length: 41, dtype: int32  

Я хотел бы разделить конкретные временные ряды в ts зависимости от идентификаторов foo , используя среднее значение каждого временного ряда из каждой группы. Итак, в конце у нас будет массив размера (20, 60, 64) , потому что есть 20 групп. До сих пор я создал метод, который, кажется, работает, но в нем не используется какое-либо логическое выражение массива, поэтому я задался вопросом, есть ли лучший способ сделать это :

 foo = foo.groupby(foo).count() # Counts the number of occurrences per id group old_data = ts[events] # Selects events in the time-series -gt; shape: (41, 60, 64) new_data = np.ones((len(foo), old_data.shape[1], old_data.shape[2])) # New array to store data  i = 0 for count, ix in enumerate(foo):  new_data[count] = np.mean(old_data[i:i ix, :, :], axis=0) # Gets the mean per id group  i  = ix   gt;gt;gt; new_data.shape (20, 60, 64)