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
Вы можете использовать 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])
Вы пробовали 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])
Просто для полноты: если значения в A
не отрицательны и достаточно малы:
lookup = np.empty((np.max(A) + 1), dtype=int)
lookup[A] = np.arange(len(A))
indices = lookup[B]
isin
вместоin1d
– bobrobbob 25 June 2018 в 15:58