Поиск индексов, где значения в моем массиве соответствуют значению в другом массиве (python) [duplicate]

typedef typename Tail::inUnion dummy;

Однако я не уверен, что реализация inUnion верна. Если я правильно понимаю, этот класс не должен быть создан, поэтому вкладка «fail» никогда не будет автоматически терпеть неудачу. Возможно, было бы лучше указать, находится ли тип в объединении или нет с простым булевым значением.

template  struct Contains;

template 
struct Contains >
{
    enum { result = Contains::result };
};

template 
struct Contains >
{
    enum { result = true };
};

template 
struct Contains
{
    enum { result = false };
};

PS: Посмотрите на Boost :: Variant

PS2: посмотрите на typelists , особенно в книге Андрея Александреску: Modern C ++ Design

9
задан Divakar 12 November 2015 в 19:58
поделиться

3 ответа

Вы можете использовать np.in1d с np.nonzero -

np.nonzero(np.in1d(A,B))[0]

Вы также можете использовать np.searchsorted , если вы хотите сохранить порядок -

np.searchsorted(A,B)

Для общего случая, когда A & amp; B - несортированные массивы, вы можете ввести параметр sorter в np.searchsorted, например:

sort_idx = A.argsort()
out = sort_idx[np.searchsorted(A,B,sorter = sort_idx)]

Я бы добавил в свою любимую broadcasting тоже в миксе, чтобы решить общий случай -

np.nonzero(B[:,None] == A)[1]

Прогон образца -

In [125]: A
Out[125]: array([ 7,  5,  1,  6, 10,  9,  8])

In [126]: B
Out[126]: array([ 1, 10,  7])

In [127]: sort_idx = A.argsort()

In [128]: sort_idx[np.searchsorted(A,B,sorter = sort_idx)]
Out[128]: array([2, 4, 0])

In [129]: np.nonzero(B[:,None] == A)[1]
Out[129]: array([2, 4, 0])
10
ответ дан Divakar 19 August 2018 в 05:13
поделиться
  • 1
    Это предполагает, что мы не заботимся о порядке; он возвращает те же результаты для B = [1,7,10], что и для [1, 10, 7]. (Вопрос OP не указывается в любом случае.) – DSM 12 November 2015 в 19:24
  • 2
    @DSM Полезные комментарии! Благодаря! Сделал это родовым. – Divakar 12 November 2015 в 19:43
  • 3
    в документах предлагается использовать теперь isin вместо in1d – bobrobbob 25 June 2018 в 15:58

Вы пробовали searchsorted?

A = np.array([1,2,3,4,5,6,7,8,9,10])
B = np.array([1,7,10])

A.searchsorted(B)
# array([0, 6, 9])
4
ответ дан Bi Rico 19 August 2018 в 05:13
поделиться

Просто для полноты: если значения в A не отрицательны и достаточно малы:

lookup = np.empty((np.max(A) + 1), dtype=int)
lookup[A] = np.arange(len(A))
indices  = lookup[B]
1
ответ дан Paul Panzer 19 August 2018 в 05:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: