gpt4 book ai didi

python - 在嵌套列表中查找大量数据python

转载 作者:行者123 更新时间:2023-12-01 03:32:45 24 4
gpt4 key购买 nike

我必须在嵌套列表中找到其中包含单词的列表并返回 bool numpy 数组。

nested_list = [['a','b','c'],['a','b'],['b','c'],['c']]
words=c
result=[1,0,1,1]

我正在使用这个列表理解来做到这一点并且它有效

np.array([word in x for x in nested_list])

但是我正在处理一个包含 700k 列表的嵌套列表,因此需要很多时间。另外,我必须做很多次,列表是静态的,但文字可以改变。

1 个带有列表理解的循环需要 0.36 秒,我需要一种更快的方法,有办法做到吗?

最佳答案

我们可以展平所有子列表中的元素,得到一个一维数组。然后,我们只需在展平的一维数组中的每个子列表的范围内查找任何出现的'c'。因此,根据这一理念,我们可以根据如何计算任何 c 的出现次数,使用两种方法。

方法#1:一种使用 np.bincount 的方法-

lens = np.array([len(i) for i in nested_list])
arr = np.concatenate(nested_list)
ids = np.repeat(np.arange(lens.size),lens)
out = np.bincount(ids, arr=='c')!=0

由于,如问题中所述,nested_list 不会在迭代中发生变化,因此我们可以重用所有内容,然后循环执行最后一步。

<小时/>

方法#2:另一种方法 np.add.reduceat重用前一个的 arrlens -

grp_idx = np.append(0,lens[:-1].cumsum())
out = np.add.reduceat(arr=='c', grp_idx)!=0

当循环遍历单词列表时,我们可以通过沿着轴使用 np.add.reduceat 并使用 来使这种方法在最后一步保持矢量化广播给我们一个2D数组 bool 值,就像这样 -

np.add.reduceat(arr==np.array(words)[:,None], grp_idx, axis=1)!=0

示例运行 -

In [344]: nested_list
Out[344]: [['a', 'b', 'c'], ['a', 'b'], ['b', 'c'], ['c']]

In [345]: words
Out[345]: ['c', 'b']

In [346]: lens = np.array([len(i) for i in nested_list])
...: arr = np.concatenate(nested_list)
...: grp_idx = np.append(0,lens[:-1].cumsum())
...:

In [347]: np.add.reduceat(arr==np.array(words)[:,None], grp_idx, axis=1)!=0
Out[347]:
array([[ True, False, True, True], # matches for 'c'
[ True, True, True, False]]) # matches for 'b'

关于python - 在嵌套列表中查找大量数据python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40697713/

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