Python:交集索引numpy数组
如何获取两个numpy数组之间的交点索引?我可以使用相交的值intersect1d
:
import numpy as np
a = 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]])