确定数组B的各元件的位置在另一数组A
鉴于两个列表:确定数组B的各元件的位置在另一数组A
In [518]: A
Out[518]: [3, 4, 2, 1, 7, 6, 5]
In [519]: B
Out[519]: [4, 6]
在B
每个元素在A
存在,无一例外。
我想检索B
的索引数组,如A所示。例如,4在A的索引1中存在,6在B
的位置5。对于这种情况我的预期输出是[1, 5]
。
这是我做得到指数:
In [520]: np.flatnonzero(np.in1d(a, b))
Out[520]: array([1, 5])
不幸的是,这不会在其他大多数情况下工作。例如,如果B = [6, 4]
,我的方法在输出[5, 1]
时仍输出[1, 5]
。
有没有一种有效的numpy方法来获得我想要实现的目标?
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)
UPDATE:如果需要的第一 occurances仅索引(如果有在A
阵列式两份),然后用this solution from @Divakar,这会更快:
In [84]: (a==b[:,None]).argmax(1)
Out[84]: array([5, 1], dtype=int64)
感谢您的回复!我一开始寻找'[1,5]',第二个''[5,1]'。你的答案似乎到达那里,但不是那里:-) –
@cᴏʟᴅsᴘᴇᴇᴅ,我已经改变了你的'a'阵列;-) – MaxU
哦,我没有意识到。是的,那正是我要找的!非常感谢! –
我不知道这是否是有效的,但
[int(np.isin(A, B[x]).nonzero()[0]) for x in range(len(B))]
似乎符合该法案。如果唯一性不那么保证int()
部分可以被去除
说实话,我自己想到了这个,但是我想要一点东西少一些... loopy。 –
如果m=A.size
和n=B.size
在哪里方法是O(mn)
。您可以通过认真梳理in1d
输出留在O((m+n)log(m+n))
(在这里唯一值):
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)
相当肯定这之前已经来呢?那些重复的东西呢? –
'np.where'的帮助给出了这个确切的例子:'ix = np.in1d(A.ravel(),B).reshape(A.shape); np.where(IX)'。对不起,不符合你的第二条标准。 –
@JonClements可能,找不到任何东西......至于B中的模糊,肯定任何值得它的盐的numpy方法都应该能够适当地处理这些,但它不会以任何方式伤害我。 –