Коротко
np.unique(a)— отсортированные уникальные значения.return_counts=Trueдобавляет частоты,return_inverse=True— номер уникального значения для каждого элемента (удобно для кодирования категорий),return_index=True— где значение встретилось впервые.axis=0ищет уникальные строки двумерного массива.- Короткие функции (NumPy 2):
unique_values,unique_counts,unique_inverse,unique_all. np.isin(a, b)— маска «элементaесть вb». Множества:intersect1d,union1d,setdiff1d,setxor1d— результат отсортирован и без повторов.
Синтаксис
np.unique(a, return_index=False, return_inverse=False,
return_counts=False, axis=None)
np.unique_counts(a) # → (values, counts)
np.isin(a, b, invert=False)
np.intersect1d(a, b), np.union1d(a, b)
np.setdiff1d(a, b), np.setxor1d(a, b)Параметры
ПараметрЧто делаетПо умолчанию
return_countsвернуть число вхождений каждого значенияFalsereturn_inverseвернуть индексы, по которым из уникальных восстанавливается исходный массивFalsereturn_indexвернуть индекс первого вхожденияFalseaxisискать уникальные срезы вдоль оси, например строки при axis=0Noneinvertв isin: True — маска «нет в b»FalseПримеры
orders = np.array(["чай", "кофе", "чай", "сок", "кофе", "чай"])np.unique(orders) # уникальные значения, отсортированныеВывод
array(['кофе', 'сок', 'чай'], dtype='<U4')
values, counts = np.unique(orders, return_counts=True)
print(values)
print(counts)
values[counts.argmax()] # самое частоеВывод
['кофе' 'сок' 'чай']
[2 1 3]
np.str_('чай')values, codes = np.unique(orders, return_inverse=True)
print(codes) # номер значения для каждого элемента
values[codes] # восстановить исходный массивВывод
[2 0 2 1 0 2] array(['чай', 'кофе', 'чай', 'сок', 'кофе', 'чай'], dtype='<U4')
print(np.unique_values(orders))
np.unique_counts(orders)Вывод
['кофе' 'сок' 'чай'] UniqueCountsResult(values=array(['кофе', 'сок', 'чай'], dtype='<U4'), counts=array([2, 1, 3]))
pairs = np.array([[1, 2], [3, 4], [1, 2]])
np.unique(pairs, axis=0) # уникальные строкиВывод
array([[1, 2],
[3, 4]])menu = np.array(["чай", "кофе"])
print(np.isin(orders, menu))
orders[~np.isin(orders, menu)] # заказы не из менюВывод
[ True True True False True True] array(['сок'], dtype='<U4')
a = np.array([1, 2, 3, 4])
b = np.array([3, 4, 5])
print(np.intersect1d(a, b)) # в обоих
print(np.union1d(a, b)) # хотя бы в одном
print(np.setdiff1d(a, b)) # в a, но не в b
np.setxor1d(a, b) # ровно в одномВывод
[3 4] [1 2 3 4 5] [1 2] array([1, 2, 5])
Подводные камни
NaN в unique
np.unique считает все NaN одним значением, хотя NaN != NaN. Чтобы каждый NaN остался отдельным, передайте equal_nan=False.
np.unique(np.array([1.0, np.nan, 2.0, np.nan])) # NaN схлопываются в одинВывод
array([ 1., 2., nan])
np.unique(np.array([1.0, np.nan, 2.0, np.nan]), equal_nan=False)Вывод
array([ 1., 2., nan, nan])
np.in1d удалён
np.in1d(orders, menu)Ошибка
AttributeError: module 'numpy' has no attribute 'in1d'