假设我有三个数组:
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 或更快的方法吗?
答案 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')