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])