Чтобы точно имитировать sorted
/ list
поведение @ Solv Divakar может использоваться с небольшой модификацией:
al = [1,2,3,2,1,3,2]
aa = np.array(al)
sorted(al, key=al.count, reverse=True)
# [2, 2, 2, 1, 3, 1, 3]
u, ids, c = np.unique(aa, return_counts=True, return_inverse=True)
aa[(-c[ids]).argsort(kind="stable")]
# array([2, 2, 2, 1, 3, 1, 3])
Если aa
большой,
from scipy import sparse
sparse.csc_matrix((aa, (c.max()-c[ids]), np.arange(len(ids)+1))).tocsr().data
# array([2, 2, 2, 1, 3, 1, 3], dtype=int64)
может быть немного быстрееНемного, однако, потому что в обоих случаях мы сначала называем дорогой unique
, если только данные не являются слишком большими целыми числами, и в этом случае доступны более быстрые альтернативы (на которые @WarrenWeckesser ссылается в комментариях), включая уловку разреженной матрицы, которую мытолько что использовал;см., например, Самый эффективный способ сортировки массива по бинам, заданным индексным массивом? .
aaa = np.tile(aa,10000)
timeit(lambda:aaa[(-c[ids]).argsort(kind="stable")], number=10)
# 0.040545254945755005
timeit(lambda:sparse.csc_matrix((aaa, (c.max()-c[ids]), np.arange(len(ids)+1))).tocsr().data, number=10)
# 0.0118721229955554