Разбиение массивов Numpy на основе его элементов, где каждый элемент массива уникален - PullRequest
0 голосов
/ 20 октября 2018

У меня есть вектор Numpy 1D, например, x = [1, 1, 1, 2, 2, 1, 3, 3, 1]

Я должен выполнить его разбиение на n подмассивов, где каждый вектор должен начинаться с нового значения и продолжаться до тех пор, пока значението же самое, что окончательный ответ [[1, 1, 1], [2, 2], [1], [3, 3], [1]].

Я понимаю, что должен использовать функцию numpy.split(), но у меня возникают проблемы с поиском мест, в которых должно быть выполнено разбиение.

Смиренно прошу вашей помощи, спасибо за ваше время!

1 Ответ

0 голосов
/ 20 октября 2018

Вам просто нужно дать numpy.split индексы, необходимые для разделения массива

a = np.array([1,1,1,2,2,1,3,3,1])
np.split(a, np.argwhere(np.diff(a) != 0)[:,0] + 1)
# [array([1, 1, 1]), array([2, 2]), array([1]), array([3, 3]), array([1])]

Подробности

Использование np.diff(a) васполучить различия между каждым последовательным элементом

np.diff(a)
# array([ 0,  0,  1,  0, -1,  2,  0, -2])

Точки, в которых различия не равны 0, - это точки, в которых элементы не последовательно совпадают.Так как вы ищете индексы, где нужно внести изменения np.diff(a) != 0, который возвращает:

np.diff(a) != 0
# array([False, False,  True, False,  True,  True, False,  True])

Чтобы преобразовать логические значения в индексы, вы можете использовать np.argwhere

np.argwhere(np.diff(a) != 0)
# array([[2],[4],[5],[7]])
# since we only need this for 1d arrays
np.argwhere(np.diff(a) != 0)[:,0]
# array([2, 4, 5, 7])

Вы просто используете вышеупомянутую процедуру для предоставления правильных индексов для np.split

np.split(a, np.argwhere(np.diff(a) != 0)[:,0])
# [array([1, 1]), array([1, 2]), array([2]), array([1, 3]), array([3, 1])]

Woops ... неправильных индексов ... Кажется, мы отключены на 1 индекс.Нет проблем, просто добавьте +1 к результатам np.argwhere

np.split(a, np.argwhere(np.diff(a) != 0)[:,0] + 1)
# [array([1, 1, 1]), array([2, 2]), array([1]), array([3, 3]), array([1])]
...