Numpy найти индексы групп с одинаковым значением - PullRequest
0 голосов
/ 03 мая 2018

У меня есть массив нулей и единиц:

y=[1,1,1,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,1,1]

Я хочу вычислить индексы групп единиц (или нулей). Таким образом, для приведенного выше примера результат для групп должен быть примерно таким:

result=[(0,2), (8,9), (16,19)]

(Как) я могу сделать это с NumPy? Я не нашел ничего похожего на функцию группировки.

Я экспериментировал с np.ediff1d , но не смог найти хорошее решение. Не то чтобы массив мог начинаться или не начинаться / заканчиваться группой единиц:

import numpy as np

y = [1,1,1,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,1,1]
mask = np.ediff1d(y)
starts = np.where(mask > 0)
ends = np.where(mask < 0)

Я также нашел частичное решение здесь: Найти индекс, где элементы изменяют значение numpy

Но этот дает мне только индексы, где значения меняются.

1 Ответ

0 голосов
/ 03 мая 2018

Мы можем сделать что-то подобное для любого универсального массива -

def islandinfo(y, trigger_val, stopind_inclusive=True):
    # Setup "sentients" on either sides to make sure we have setup
    # "ramps" to catch the start and stop for the edge islands
    # (left-most and right-most islands) respectively
    y_ext = np.r_[False,y==trigger_val, False]

    # Get indices of shifts, which represent the start and stop indices
    idx = np.flatnonzero(y_ext[:-1] != y_ext[1:])

    # Lengths of islands if needed
    lens = idx[1::2] - idx[:-1:2]

    # Using a stepsize of 2 would get us start and stop indices for each island
    return zip(idx[:-1:2], idx[1::2]-int(stopind_inclusive)), lens

Пробный прогон -

In [320]: y
Out[320]: array([1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1])

In [321]: islandinfo(y, trigger_val=1)[0]
Out[321]: [(0, 2), (8, 9), (16, 19)]

In [322]: islandinfo(y, trigger_val=0)[0]
Out[322]: [(3, 7), (10, 15)]

В качестве альтернативы, мы можем использовать diff, чтобы получить срезы сравнения, а затем просто изменить форму столбцами 2, чтобы заменить пошаговое нарезание, чтобы получить однострочность -

In [300]: np.flatnonzero(np.diff(np.r_[0,y,0])!=0).reshape(-1,2) - [0,1]
Out[300]: 
array([[ 0,  2],
       [ 8,  9],
       [16, 19]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...