Python:交集索引numpy数组

发布于 2021-01-29 15:19:16

如何获取两个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

关注者
0
被浏览
48
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您可以使用产生的布尔数组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-这可能是最正确的做法,因为它返回的统一名单的元组XY…坐标:

    >>> 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]])
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看