Python - 优化代码(循环遍历数组)

时间:2017-11-27 22:03:03

标签: python arrays numpy

我有两个数组,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相同。

2 个答案:

答案 0 :(得分:3)

您可以使用np.ind1dnp.isin

  

返回与元素相同形状的布尔数组,即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])

不清楚CD是否转换为集合,但我认为它会比您当前的代码更快。

答案 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)