【发布时间】:2018-04-17 22:51:03
【问题描述】:
我有两个感兴趣的矩阵,第一个是“词袋”矩阵,有两列:文档 ID 和术语 ID。例如:
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]])
此外,我有一个“索引”矩阵,其中矩阵中的每一行都包含词袋矩阵中给定文档 ID 的第一行和最后一行的索引。例如:第 0 行是 doc id 0 的第一个和最后一个索引。例如:
index[0:4]
Out[2]:
array([[ 0, 4],
[ 4, 6],
[ 6, 9],
[ 9, 10]])
我想做的是随机抽取文档 ID 的样本,并获取这些文档 ID 的所有单词行包。词袋矩阵大约有 150M 行(~1.5Gb),所以使用 numpy.in1d() 太慢了。我们需要快速返回这些以供下游任务使用。
我想出的幼稚解决方案如下:
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])
通用示例
提出问题的通用示例是这样的 -
indices = np.array([[ 4, 7],
[10,16],
[11,18]]
预期的输出将是 -
array([ 4, 5, 6, 10, 11, 12, 13, 14, 15, 11, 12, 13, 14, 15, 16, 17])
【问题讨论】:
-
考虑到您尝试生成的输出是锯齿状的,因此不会有一个好的矢量化解决方案。
-
由于端点与下一组的开始相邻,因此连接的 o/p 将只是
range(a[0,0],a[-1,-1]),对吧? -
在不经过锯齿状中间数组的情况下生成
concatenate输出可能是矢量化的。 -
...嘿,是的,范围都是这样连续的吗? Divakar 提出了一个很好的观点,如果他们是的话。
-
@Divark - 不一定,它可能是一个随机的索引列表,例如:arr[[5,100, 31, 123]]。不过你是对的,它们是锯齿状的。我目前的方法: sparse_rows = np.concatenate([np.arange(x1, x2) for x1,x2 in arr[idxs]]) 非常慢
标签: python arrays numpy optimization vectorization