У меня есть два (отсортированных) массива, A и B, разной длины, каждая из которых содержит уникальные метки, которые повторяются несколько раз.
Количество для каждой метки в A меньше или равно количеству в B.
Все метки в A будут в B, но некоторые метки в B не появляются в A.
Мне нужен объект такой же длины, как B, где для каждой метки i
в A (что происходит k_i
раз), первые k_i
вхождения метки i
в B должны быть установлены на False
.
Остальные элементы должны быть True
.
Следующий код дает мне то, что мне нужно, но если A и B большие, это может занять много времени:
import numpy as np
# The labels and their frequency
A = np.array((1,1,2,2,3,4,4,4))
B = np.array((1,1,1,1,1,2,2,3,3,4,4,4,4,4,5,5))
A_uniq, A_count = np.unique(A, return_counts = True)
new_ind = np.ones(B.shape, dtype = bool)
for i in range(len(A_uniq)):
new_ind[np.where(B == A_uniq[i])[0][:A_count[i]]] = False
print(new_ind)
#[False False True True True False False False True False False False
# True True True True]
Есть ли более быстрый или эффективный способ сделать это? Я чувствую, что могу упустить какое-то очевидное вещательное или векторизованное решение.