gpt4 book ai didi

python - 以矢量化方式连接给定开始、结束数字的范围数组 - NumPy

转载 作者:行者123 更新时间:2023-11-28 22:23:15 26 4
gpt4 key购买 nike

我有两个感兴趣的矩阵,第一个是“词袋”矩阵,有两列:文档 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 行是文档 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])

最佳答案

我想我终于用 cumsum 破解了它矢量化解决方案的技巧 -

def create_ranges(a):
l = a[:,1] - a[:,0]
clens = l.cumsum()
ids = np.ones(clens[-1],dtype=int)
ids[0] = a[0,0]
ids[clens[:-1]] = a[1:,0] - a[:-1,1]+1
out = ids.cumsum()
return out

样本运行-

In [416]: a = np.array([[4,7],[10,16],[11,18]])

In [417]: create_ranges(a)
Out[417]: array([ 4, 5, 6, 10, 11, 12, 13, 14, 15, 11, 12, 13, 14, 15, 16, 17])

In [425]: a = np.array([[-2,4],[-5,2],[11,12]])

In [426]: create_ranges(a)
Out[426]: array([-2, -1, 0, 1, 2, 3, -5, -4, -3, -2, -1, 0, 1, 11])

如果给定开始和停止作为两个 1D 数组,我们只需要使用它们来代替第一列和第二列。为了完整起见,这里是完整的代码 -

def create_ranges(starts, ends):
l = ends - starts
clens = l.cumsum()
ids = np.ones(clens[-1],dtype=int)
ids[0] = starts[0]
ids[clens[:-1]] = starts[1:] - ends[:-1]+1
out = ids.cumsum()
return out

关于python - 以矢量化方式连接给定开始、结束数字的范围数组 - NumPy,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47125697/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com