Python 确定数组B的每个元素在另一个数组A中的位置

Python 确定数组B的每个元素在另一个数组A中的位置,python,arrays,numpy,indexing,Python,Arrays,Numpy,Indexing,给出两个列表: In [518]: A Out[518]: [3, 4, 2, 1, 7, 6, 5] In [519]: B Out[519]: [4, 6] B中的每个元素都存在于A中,没有例外 我想为B检索一个索引数组,如A中所示。例如,A中的索引1中有4,而B的位置5中有6。对于这个场景,我的预期输出是[1,5] 这是我为获取索引所做的: In [520]: np.flatnonzero(np.in1d(a, b)) Out[520]: array([1, 5]) 不幸的是,这在大

给出两个列表:

In [518]: A
Out[518]: [3, 4, 2, 1, 7, 6, 5]

In [519]: B
Out[519]: [4, 6]
B
中的每个元素都存在于
A
中,没有例外

我想为
B
检索一个索引数组,如A中所示。例如,A中的索引1中有4,而
B
的位置5中有6。对于这个场景,我的预期输出是
[1,5]

这是我为获取索引所做的:

In [520]: np.flatnonzero(np.in1d(a, b))
Out[520]: array([1, 5])
不幸的是,这在大多数其他情况下都不起作用。例如,如果
B=[6,4]
,我的方法在应该输出
[5,1]
时仍然输出
[1,5]


有没有一个有效的方法来实现我想要实现的目标

我不知道它是否有效,但是

[int(np.isin(A, B[x]).nonzero()[0]) for x in range(len(B))]
这似乎很合适。如果不保证唯一性,则可以删除
int()
部分

IIUC:

In [71]: a
Out[71]: array([3, 4, 2, 1, 7, 6, 5, 6, 4])

In [72]: b
Out[72]: array([4, 6])

In [73]: np.where(a==b[:,None])[1]
Out[73]: array([1, 8, 5, 7], dtype=int64)

In [74]: b = np.array([6, 4])

In [75]: np.where(a==b[:,None])[1]
Out[75]: array([5, 7, 1, 8], dtype=int64)
更新:如果只需要第一次发生的索引(如果
数组中存在重复项),则使用,这将更快:

In [84]: (a==b[:,None]).argmax(1)
Out[84]: array([5, 1], dtype=int64)

如果
m=A.size
n=B.size
的方法是
O(mn)
。您可以在
O((m+n)log(m+n))
中仔细排序
inad
输出(此处有唯一值):


相当肯定这以前出现过?重复的呢?
np的帮助中给出了一个确切的例子:
ix=np.in1d(A.ravel(),B)。重塑(A.shape);np.其中(ix)
。很抱歉,不符合您的第二个标准。@p-robot是的,而且,我的
flatnonzero
方法更好一些。;-)@星号是的,这个问题的灵感来源于Martijn Pieters的回答,稍微修改一下,我就可以在python中找到我想要的东西。我的问题更多的是出于对“如何”的好奇ᴏʟᴅsᴘᴇᴇᴅ 啊哈!我知道我以前见过这些A和B:我自己也想到了这一点,但我想少一点。。。多谢你的回复!我在第一个实例中查找
[1,5]
,在第二个实例中查找
[5,1]
。你的答案似乎达到了目的,但并不完全达到目的:-)@cᴏʟᴅsᴘᴇᴇᴅ, 我已更改了您的
a
array;-)天啊,我没意识到。是的,那正是我要找的!非常感谢!我想你需要
(a==b[:,无]).argmax(1)
如果。@Divakar,是的,我完全同意;-)
A= np.unique(np.random.randint(0,100000,100000))
np.random.shuffle(A)
B=np.unique(np.random.randint(0,10000,10000))
np.random.shuffle(B)

def find(A,B):
    pos=np.in1d(A,B).nonzero()[0]
    return pos[A[pos].argsort()][B.argsort().argsort()]

In [5]: np.allclose(np.where(np.equal.outer(B,A))[1],find(A,B))
Out[5]: True

In [6]: %time np.where(np.equal.outer(B,A))[1]
Wall time: 3.98 s
Out[6]: array([88220, 13472, 12482, ...,  9795, 39524,  5727], dtype=int64)

In [7]: %timeit find(A,B)
22.6 ms ± 366 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)