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

Python find values in numpy array2 based on values in array1

假设我有三个数组:

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

我想遍历 array1 中的每个元素和 return 当且仅当它在 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']

使用像 intersect 这样的命令只 returns 唯一值,所以任何重复项都被删除(这不是这里想要的)。

我有一些类似的东西:

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 或更快的方法来做到这一点?

您可以不循环执行此操作:

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')