Сочетание модной индексации numpys с нарезкой - PullRequest
0 голосов
/ 12 октября 2018

В настоящее время у меня есть двумерный массив numpy формы (m, n).Кроме того, у меня есть два (m, p) массива индексов i1 и i2.Индексы всегда смежны!

import numpy as np
t = np.array([[-1, -1,  0,  0,  1,  2,  2],
              [-1, -1,  0,  1,  2,  3,  3],
              [0,  0,  1,  2,  2,  3,  3]])

i1 = np.array([3, 2, 2])
i2 = np.array([4, 3, 3])

Как использовать массивы i1 и i2 для нарезки t для получения следующей подматрицы?

expected_t = np.array([
                      [0, 1],
                      [0, 1],
                      [1, 2]
])

То есть

expected_t[0, :] = t[0, i1[0]:i2[0]]
expected_t[1, :] = t[1, i1[1]:i2[1]]
expected_t[2, :] = t[2, i1[2]:i2[2]]

Кроме того, возможно ли обойтись без копирования данных путем создания представления?

Заранее благодарим за помощь!

1 Ответ

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

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

import numpy as np
t = np.array([[-1, -1,  0,  0,  1,  2,  2],
              [-1, -1,  0,  1,  2,  3,  3],
              [0,  0,  1,  2,  2,  3,  3]])

i1 = np.array([3, 2, 2])
i2 = np.array([4, 3, 3])

output = [] 
for i, (min_, max_) in enumerate(zip(i1, i2)):
    output.append(t[i, min_:max_+1])

expected_t = np.array(output)

Или короче:

expected_t = np.array([t[i, j:k+1] for (i,j,k) in zip(range(len(t)), i1, i2)])
...