Concatena as matrizes de intervalo com início, parada de números de maneira vetorizada - NumPy

Eu tenho duas matrizes de interesse, a primeira é uma matriz "saco de palavras", com duas colunas: o ID do documento e o termo ID. Por exemplo:

bow[0:10]

Out[1]:
    array([[ 0, 10],
           [ 0, 12],
           [ 0, 19],
           [ 0, 20],
           [ 1,  9],
           [ 1, 24],
           [ 2, 33],
           [ 2, 34],
           [ 2, 35],
           [ 3, 2]])

Além disso, eu tenho uma matriz de "índice", em que cada linha da matriz contém o índice da primeira e da última linha para uma determinada ID do documento na matriz de saco de palavras. Ex: a linha 0 é o primeiro e o último índice do ID de documento 0. Por exemplo:

index[0:4]

Out[2]:
    array([[ 0,  4],
           [ 4,  6],
           [ 6,  9],
           [ 9, 10]])

O que eu gostaria de fazer é pegar uma amostra aleatória de IDs de documentos e obter todo o conjunto de linhas de palavras para essas IDs de documentos. A matriz do conjunto de palavras tem aproximadamente 150M linhas (~ 1.5Gb), portanto, usar numpy.in1d () é muito lento. Precisamos devolvê-los rapidamente para alimentar uma tarefa a jusante.

A solução ingênua que encontrei é a seguinte:

def get_rows(ids):
    indices = np.concatenate([np.arange(x1, x2) for x1,x2 in index[ids]])
    return bow[indices]

get_rows([4,10,3,5])

Amostra genérica

Uma amostra genérica para apresentar o problema seria algo como isto -

indices = np.array([[ 4, 7],
                    [10,16],
                    [11,18]]

O resultado esperado seria -

array([ 4,  5,  6, 10, 11, 12, 13, 14, 15, 11, 12, 13, 14, 15, 16, 17])