我有两个数组,A和B.基于一个函数,我从A创建一个子集C,从B创建一个子集D.现在,我想将它们连接在一起(我想保留那些在C中的项目)和D在A和B中具有相同的索引。
arr.filter(string => string.length > 4)
这是我到目前为止所做的,但它确实很慢。有没有办法优化它以使其更快?
LE:您可以看到A中的元素3与B中的元素18具有相同的索引(索引= 3),与A中的元素13和B中的8相同。
答案 0 :(得分:3)
返回与元素相同形状的布尔数组,即True 其中元素的元素在test_elements中,否则为False。
>>> import numpy as np
>>> A = np.array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20])
>>> B = np.array([20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1])
>>> C = np.array([3,7,13])
>>> D = np.array([18,8])
>>> np.in1d(A, C) & np.in1d(B, D)
array([False, False, True, False, False, False, False, False, False,
False, False, False, True, False, False, False, False, False,
False, False], dtype=bool)
>>> indices = np.isin(A, C) & np.isin(B, D)
>>> A[indices]
array([ 3, 13])
>>> B[indices]
array([18, 8])
不清楚C
和D
是否转换为集合,但我认为它会比您当前的代码更快。
答案 1 :(得分:1)
我并非100%确定我正确地解释了您的问题,但拉链和列表理解的组合可能就是您所追求的。
fv = [(a, b) for (a, b) in zip(A, B)
if <condition for first list>
and <condition for second list>]
fv1 = [t[0] for t in fv]
fv2 = [t[1] for t in fv]
zip将您的列表连接到一个元组列表中。
list(zip([1, 2, 3],['a','b','c'])) == [(1,'a'),(2,'b'),(3,'c')]
然后,您可以根据列表理解中的条件过滤所需的输出。例如:
fv = [(a, b) for (a, b) in zip(range(10),'abcdefghijklmnop')
if a%2
and b>'d']
[(5, 'f'), (7, 'h'), (9, 'j')]
您的案件实际上可以作为一个班轮来完成:
fv1, fv2 = zip(*((a, b) for (a, b) in zip(A, B) if a in C and b in D))
fv1 #(3, 13)
fv2 #(18, 8)