Numpy: как заменить редкие числа в массиве на -1?

У меня есть огромный массив, в котором я дал уникальные индексы каждым растениям (1,2,3,...,n). Получается в массиве есть блок одинаковых чисел(индексов), и если число повторений этого индекса < 15, то этот индекс нужно заменить на -1.

Как я пробовал это сделать?

array2 = np.unique(array, return_counts=True) #Ищу кол-во индексов
i = 0
while i <= array2[1].size:
    array[array == array2[0][i] & array2[1][i] < 15] = -1 #Делаю замену в цикле
    i = i + 1

А вот если вот так, то работает, только очень долго

if (array2[1][i] < 15):
    array[array == array2[0][i]] = -1
    i = i + 1

Большой блок с одинаковым индексом Маленький блок с одинаковым индексом, который нужно заменить на -1


Ответы (1 шт):

Автор решения: Pak Uula

Первый шаг с подсчетом числа вхождений через unique вы сделали совершенно верно.

Ваш цикл можно заменить на numpy.extract и numpy.isin

Так как у меня нет ваших данных, то вот пример со случайным вектором:

# 1000 целых от 0 до 100
A = np.random.randint(100, size=1000)
# подсчет числа вхождений
B = np.unique(A, return_counts=True)
# Извлечение элементов, удовлетворяющих условию
C = np.extract(B[1] < 15, B[0])
# Замена извлечённых элементов на -1
A[np.isin(A, C)] = -1

Функция numpy.isin(A,C) возвращает маску True для элементов массива A, которые принадлежат массиву C, и False для всех остальных.

→ Ссылка