根据另一个列表或数组查找 array/list 中元素的索引
Finding the index of elements in an array/list based on another list or array
我有两个lists/arrays,如果另一个列表中存在相同的数字,我想在一个列表中找到元素的索引。这是一个例子
list_A = [1,7,9,7,11,1,2,3,6,4,9,0,1]
list_B = [9,1,7]
#output required : [0,1,2,3,5,10,12]
希望使用 numpy 的任何方法
使用列表理解和enumerate()
:
>>> list_A = [1,7,9,7,11,1,2,3,6,4,9,0,1]
>>> list_B = [9,1,7]
>>> [i for i, x in enumerate(list_A) if x in list_B]
[0, 1, 2, 3, 5, 10, 12]
使用 numpy:
>>> import numpy as np
>>> np.where(np.isin(list_A, list_B))
(array([ 0, 1, 2, 3, 5, 10, 12], dtype=int64),)
此外,正如 @Chris_Rands 指出的那样,我们也可以先将 list_B
转换为一个集合,因为 in
对于集合来说是 O(1) 而不是 O(n ) 对于列表。
时间比较:
import random
import numpy as np
import timeit
list_A = [random.randint(0,100000) for _ in range(100000)]
list_B = [random.randint(0,100000) for _ in range(50000)]
array_A = np.array(A)
array_B = np.array(B)
def lists_enumerate(list_A, list_B):
return [i for i, x in enumerate(list_A) if x in set(list_B)]
def listB_to_set_enumerate(list_A, list_B):
set_B = set(list_B)
return [i for i, x in enumerate(list_A) if x in set_B]
def numpy(array_A, array_B):
return np.where(np.isin(array_A, array_B))
结果:
>>> %timeit lists_enumerate(list_A, list_B)
48.8 s ± 638 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
>>> %timeit listB_to_set_enumerate(list_A, list_B)
11.2 ms ± 856 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
>>> %timeit numpy(array_A, array_B)
23.3 ms ± 167 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
很明显,对于较大的列表,最好的解决方案是在应用枚举之前将 list_B
转换为集合,或者使用 numpy。
我有两个lists/arrays,如果另一个列表中存在相同的数字,我想在一个列表中找到元素的索引。这是一个例子
list_A = [1,7,9,7,11,1,2,3,6,4,9,0,1]
list_B = [9,1,7]
#output required : [0,1,2,3,5,10,12]
希望使用 numpy 的任何方法
使用列表理解和enumerate()
:
>>> list_A = [1,7,9,7,11,1,2,3,6,4,9,0,1]
>>> list_B = [9,1,7]
>>> [i for i, x in enumerate(list_A) if x in list_B]
[0, 1, 2, 3, 5, 10, 12]
使用 numpy:
>>> import numpy as np
>>> np.where(np.isin(list_A, list_B))
(array([ 0, 1, 2, 3, 5, 10, 12], dtype=int64),)
此外,正如 @Chris_Rands 指出的那样,我们也可以先将 list_B
转换为一个集合,因为 in
对于集合来说是 O(1) 而不是 O(n ) 对于列表。
时间比较:
import random
import numpy as np
import timeit
list_A = [random.randint(0,100000) for _ in range(100000)]
list_B = [random.randint(0,100000) for _ in range(50000)]
array_A = np.array(A)
array_B = np.array(B)
def lists_enumerate(list_A, list_B):
return [i for i, x in enumerate(list_A) if x in set(list_B)]
def listB_to_set_enumerate(list_A, list_B):
set_B = set(list_B)
return [i for i, x in enumerate(list_A) if x in set_B]
def numpy(array_A, array_B):
return np.where(np.isin(array_A, array_B))
结果:
>>> %timeit lists_enumerate(list_A, list_B)
48.8 s ± 638 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
>>> %timeit listB_to_set_enumerate(list_A, list_B)
11.2 ms ± 856 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
>>> %timeit numpy(array_A, array_B)
23.3 ms ± 167 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
很明显,对于较大的列表,最好的解决方案是在应用枚举之前将 list_B
转换为集合,或者使用 numpy。