确定阵列B中每个元素在另一个阵列A中的位置

时间:2017-10-21 10:19:55

标签: 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中的6位于第5位。对于这种情况,我的预期输出为[1, 5]

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

In [520]: np.flatnonzero(np.in1d(a, b))
Out[520]: array([1, 5])

不幸的是,这在大多数其他情况下都不起作用。例如,如果B = [6, 4],我的方法在输出[1, 5]时仍会输出[5, 1]

是否有一种有效的numpy方式来获得我想要实现的目标?

3 个答案:

答案 0 :(得分:2)

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)

更新:如果您只需要第一次出现的索引(如果A数组中有重复项),则使用this solution from @Divakar,哪个会更快:

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

答案 1 :(得分:0)

我不知道它是否有效但是

[int(np.isin(A, B[x]).nonzero()[0]) for x in range(len(B))]

似乎符合要求。如果无法保证唯一性,则可以移除int()部分

答案 2 :(得分:0)

如果function sqoot(URL) { $.ajax({ url: URL, method: "GET" }).done(function (response) { var deals = response.deals var untrackedURL = $("#untrackedURL"); var couponInfo = $("#info"); for (i = 0; i < deals.length; i++) { var newUntrackedURL = $('<a href="' + deals[i].deal.untracked_url + '">' + deals[i].deal.untracked_url + "</a>"); couponInfo.append(newUntrackedURL) } }) }; m=A.size的方法是n=B.size。您可以通过仔细排序O(mn)输出(此处包含唯一值)来留在O((m+n)log(m+n))

in1d