Python:交集索引numpy数组
如何获取两个numpy数组之间的交点索引?我可以使用相交的值intersect1d
:
import numpy as npa = np.array(xrange(11))
b = np.array([2, 7, 10])
inter = np.intersect1d(a, b)
# inter == array([ 2, 7, 10])
但是,如何获取a
这些值的索引inter
?
回答:
您可以使用产生的布尔数组in1d
为编制索引arange
。反转a
以使索引不同于值:
>>> a[::-1]array([10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
>>> a = a[::-1]
intersect1d
仍然返回相同的值…
>>> numpy.intersect1d(a, b)array([ 2, 7, 10])
但是in1d
返回一个布尔数组:
>>> numpy.in1d(a, b)array([ True, False, False, True, False, False, False, False, True,
False, False], dtype=bool)
可以用来索引范围:
>>> numpy.arange(a.shape[0])[numpy.in1d(a, b)]array([0, 3, 8])
>>> indices = numpy.arange(a.shape[0])[numpy.in1d(a, b)]
>>> a[indices]
array([10, 7, 2])
为了简化以上,不过,你可以使用nonzero
-这可能是最正确的做法,因为它返回的统一名单的元组X
,Y
…坐标:
>>> numpy.nonzero(numpy.in1d(a, b))(array([0, 3, 8]),)
或者,等效地:
>>> numpy.in1d(a, b).nonzero()(array([0, 3, 8]),)
结果可以用作a
没有问题的相同形状数组的索引。
>>> a[numpy.nonzero(numpy.in1d(a, b))]array([10, 7, 2])
但是请注意,在许多情况下,仅使用布尔数组本身,而不是将其转换为一组非布尔索引是有意义的。
最后,您还可以将boolean数组传递给argwhere
,从而产生形状略有不同的结果,该结果不适合索引,但可能对其他目的很有用。
>>> numpy.argwhere(numpy.in1d(a, b))array([[0],
[3],
[8]])
以上是 Python:交集索引numpy数组 的全部内容, 来源链接: utcz.com/qa/417817.html