Python根据array1中的值在numpy array2中查找值

时间:2020-04-23 19:28:11

标签: python numpy match intersect

假设我有三个数组:

array1 = ['1', '2', '3', '2']
array2 = ['6', '2', '7', '3']
array3 = ['a', 'b', 'c', 'd']

我想遍历array1中的每个元素,并仅当在array2中时才返回匹配的值。换句话说,我希望输出为:

array2_in_1 = ['1' '3' '1']

因为'1'不在array2中,所以没有考虑。

'2'在array2的第一个索引中,因此该索引记录为'1'

'3'在array2的第3个索引中,因此记录为'3'

'2'再次记录在array2的第一个索引处,因此重复'1'

然后使用这些索引,我想基于来自array3的这些索引访问元素:

array3_in_2 = ['b' 'd' 'b']

使用诸如相交之类的命令只会返回唯一值,因此所有重复项都将被删除(此处不再需要)。

我有类似的东西:

vals = []
for i in array1:
    idx = np.where(array2 == i)
    if len(vals) == 0:
        vals = array2[idx]
    else:
        vals = np.concatenate((vals, array2[idx]))

给出正确答案,但是还有更多的 pythonic 或更快的方法吗?

1 个答案:

答案 0 :(得分:2)

您可以执行以下操作而无需循环:

def ind():
    array1 = np.array(['1', '2', '3', '2'])
    array2 = np.array(['6', '2', '7', '3'])
    array3 = np.array(['a', 'b', 'c', 'd'])     
    return array3[(array1 == array2[:,np.newaxis]).T.nonzero()[1]]

结果:

>>> ind()
array(['b', 'd', 'b'], 
      dtype='<U1')
相关问题