Вы можете использовать np.unique , чтобы получить уникальные элементы и счетчики, а затем создать словарь, в котором ключи - это старые значения, а значения - новые. Наконец, примените его ко всему массиву, используя np.vectorize :
import numpy as np
from operator import itemgetter
arr = np.array([2, 2, 0, 0, 0, 1, 3, 3, 3, 3])
# get unique elements and counts
counts = zip(*np.unique(arr, return_counts=True))
# create a lookup dictionary value -> i where values are sorted according to frequency
mapping = {value: i for i, (value, _) in enumerate(sorted(counts, key=itemgetter(1)))}
# apply the dictionary in a vectorized way
result = np.vectorize(mapping.get)(arr)
print(result)
Выход
[1 1 2 2 2 0 3 3 3 3]
A, возможно, чище, альтернативаиспользовать collection.Counter , для подсчета и создания словаря сопоставления:
# get unique elements and counts
counts = Counter(arr)
# create a lookup dictionary value -> i where values are sorted according to frequency
mapping = {value: i for i, value in enumerate(sorted(counts, key=counts.get))}