Как разделить массив по индексам, где в разделенных подмассивах есть точка разделения - PullRequest
0 голосов
/ 03 января 2019

У меня есть 2D-массив, содержащий значения, и 1D-массив со значениями индекса, где я хотел бы разбить 2D-матрицу, где разделенные подмассивы включают «точку разделения».

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

Но, похоже, stride_ticks применяется только в том случае, если мы хотим разбить массив на подмассивы одинакового размера.

Минимальный пример, я могу сделать следующее:

>>> import numpy as np
>>> array = np.random.randint(0,10, (10,2))
>>> indices = np.array([2,3,8])
>>> array
array([[8, 1],
       [1, 0],
       [2, 0],
       [8, 8],
       [1, 6],
       [7, 8],
       [4, 4],
       [9, 4],
       [6, 7],
       [6, 4]])

>>> split_array = np.split(array, indices, axis=0)
>>> split_array
[array([[8, 1],
        [1, 0]]), 

 array([[2, 0]]), 

 array([[8, 8],
        [1, 6],
        [7, 8],
        [4, 4],
        [9, 4]]), 

 array([[6, 7],
        [6, 4]])]

Но я просто ищу параметр в функции split, где я мог бы определить include_split_point=True, который дал бы мне такой результат:

[array([[8, 1],
        [1, 0],
        [2, 0]]), 

 array([[2, 0],
        [8, 8]]), 

 array([[8, 8],
        [1, 6],
        [7, 8],
        [4, 4],
        [9, 4],
        [6, 7]]), 

 array([[6, 7],
        [6, 4]])]

1 Ответ

0 голосов
/ 03 января 2019

Создание нового массива с повторяющимися элементами индекса

new_indices = np.zeros(array.shape[0], dtype = int)
new_indices[indices] = 1
new_indices += 1
new_array = np.repeat(array, new_indices, axis = 0)

Обновление индексов для учета измененного массива

indices = indices + np.arange(1, len(indices)+1)

Разделение с использованием индексов как обычно

np.split(new_array, indices, axis = 0)

вывод:

[array([[8, 1],
        [1, 0],
        [2, 0]]), 
 array([[2, 0],
        [8, 8]]), 
 array([[8, 8],
        [1, 6],
        [7, 8],
        [4, 4],
        [9, 4],
        [6, 7]]), 
 array([[6, 7],
        [6, 4]])]
...