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

原文由 invis 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 885
2 个回答

您可以使用 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])

但请注意,在许多情况下,仅使用布尔数组本身是有意义的,而不是将其转换为一组非布尔索引。

最后,您还可以将布尔数组传递给 argwhere ,这会产生形状略有不同的结果,不适合索引,但可能对其他用途有用。

 >>> numpy.argwhere(numpy.in1d(a, b))
array([[0],
       [3],
       [8]])

原文由 senderle 发布,翻译遵循 CC BY-SA 3.0 许可协议

indices = np.argwhere(np.in1d(a,b))

原文由 Will 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题