Ответ 1
Вы можете использовать булевский массив, созданный 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])
Но обратите внимание, что при многих обстоятельствах имеет смысл просто использовать только логический массив, а не преобразовывать его в набор небулевых индексов.
Наконец, вы также можете передать логический массив argwhere
, который дает результат немного иначе, что не подходит для индексации, но может быть полезен для других целей.
>>> numpy.argwhere(numpy.in1d(a, b))
array([[0],
[3],
[8]])