如果相同的值多次出现,则使np.where返回相同的坐标

时间:2017-07-12 00:08:34

标签: python numpy

正如标题所说,我想让np.where()多次返回一个坐标,如果遇到相同的值,例如:

import numpy as np
a = 2*np.arange(5)
b = [8,8]
condition = np.isin(a,b)
print np.where(condition)
>>> (array([4], dtype=int64),)

它返回[4],因为a [4] = 8,但由于b有两个8,我希望它返回[4,4],有没有办法在不迭代每个b值的情况下执行此操作?

1 个答案:

答案 0 :(得分:1)

使用ab

In [687]: condition=isin(a,b)
In [688]: condition
Out[688]: array([False, False, False, False,  True], dtype=bool)

where只是告诉我们一个True值的索引。

切换测试,您发现b的两个项都在a

In [697]: isin(b,a)
Out[697]: array([ True,  True], dtype=bool)

您可以使用简单的广播比较:

In [700]: a[:,None]==b
Out[700]: 
array([[False, False],
       [False, False],
       [False, False],
       [False, False],
       [ True,  True]], dtype=bool)
In [701]: np.where(a[:,None]==b)
Out[701]: (array([4, 4], dtype=int32), array([0, 1], dtype=int32))

isin(及其使用的in1d)担心唯一性,但您不是。因此,测试数组==可以让您获得更多控制权。

测试b中的两个值是否匹配相同的a元素

In [703]: (a[:,None]==b).all(axis=1)
Out[703]: array([False, False, False, False,  True], dtype=bool)

测试是否存在 - 基本上是in1d所做的:

In [704]: (a[:,None]==b).any(axis=1)
Out[704]: array([False, False, False, False,  True], dtype=bool)