Здесь вы go (РЕДАКТИРОВАТЬ: вам, вероятно, нужно скопировать тензоры в процессор, используя tensor=tensor.cpu()
перед выполнением следующих операций):
index = tensor([[124, 583, 158, 529],
[172, 631, 206, 577]], device='cuda:0')
#create a concatenated list of ranges of indices you desire to slice
indexer = np.r_[tuple([np.s_[i:j] for (i,j) in zip(index[0,:],index[1,:])])]
#slice using numpy indexing
sliced_inp = inp[:, indexer, :]
Вот как это работает:
np.s_[i:j]
создает объект среза (просто диапазон) индексов от начала = i
до конца = j
.
np.r_[i:j, k:m]
создает список ВСЕХ индексов в срезах (i,j)
и (k,m)
(Вы можете передать большее количество срезов в np.r_
, чтобы объединить их все вместе за один раз. Это пример объединения только двух срезов .)
Следовательно, indexer
создает список ВСЕХ индексов путем объединения списка срезов (каждый срез является диапазоном индексов).
ОБНОВЛЕНИЕ: Если вам необходимо удалить интервальные наложения и сортировать интервалы:
indexer = np.unique(indexer)
, если вы хотите удалить интервальные перекрытия, но не сортировать и не сохранять исходный порядок (и первые появления перекрытий)
uni = np.unique(indexer, return_index=True)[1]
indexer = [indexer[index] for index in sorted(uni)]