2017-10-21 50 views
2

鉴于两个列表:确定数组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方法来获得我想要实现的目标?

+1

相当肯定这之前已经来呢?那些重复的东西呢? –

+0

'np.where'的帮助给出了这个确切的例子:'ix = np.in1d(A.ravel(),B).reshape(A.shape); np.where(IX)'。对不起,不符合你的第二条标准。 –

+0

@JonClements可能,找不到任何东西......至于B中的模糊,肯定任何值得它的盐的numpy方法都应该能够适当地处理这些,但它不会以任何方式伤害我。 –

回答

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) 

UPDATE:如果需要的第一 occurances仅索引(如果有在A阵列式两份),然后用this solution from @Divakar,这会更快:

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

感谢您的回复!我一开始寻找'[1,5]',第二个''[5,1]'。你的答案似乎到达那里,但不是那里:-) –

+0

@cᴏʟᴅsᴘᴇᴇᴅ,我已经改变了你的'a'阵列;-) – MaxU

+0

哦,我没有意识到。是的,那正是我要找的!非常感谢! –

0

我不知道这是否是有效的,但

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

似乎符合该法案。如果唯一性不那么保证int()部分可以被去除

+0

说实话,我自己想到了这个,但是我想要一点东西少一些... loopy。 –

0

如果m=A.sizen=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) 
相关问题