Как найти количество уникальных значений в массиве NumPy?

Что такое уникальные значения в массиве NumPy?

В массиве NumPy уникальные значения – это те элементы, которые встречаются в массиве только один раз (в отличие от повторяющихся элементов). Важно понимать, что при поиске уникальных значений порядок элементов в исходном массиве не сохраняется.

Зачем находить количество уникальных значений?

Определение количества уникальных значений – часто встречающаяся задача в анализе данных и машинном обучении. Вот несколько примеров:

  • Оценка разнообразия данных: Определение числа уникальных категорий в наборе данных помогает понять его разнородность.
  • Предварительная обработка данных: Удаление дубликатов и работа только с уникальными значениями может значительно улучшить производительность алгоритмов машинного обучения.
  • Анализ поведения пользователей (например, в интернет-маркетинге): Выявление уникальных посетителей веб-сайта, уникальных кликов по рекламным объявлениям или уникальных продуктов, добавленных в корзину.

Основные методы NumPy для подсчета уникальных значений

Функция numpy.unique(): обзор и применение

Функция numpy.unique() – основной инструмент для извлечения уникальных элементов из массива NumPy. Она возвращает отсортированный массив уникальных значений.

import numpy as np
from typing import List, Union

def get_unique_values(arr: np.ndarray) -> np.ndarray:
    """Возвращает массив уникальных значений из входного массива NumPy."""
    return np.unique(arr)

# Пример использования
data: np.ndarray = np.array([1, 2, 2, 3, 4, 4, 5])
unique_values: np.ndarray = get_unique_values(data)
print(f"Уникальные значения: {unique_values}") # Output: Уникальные значения: [1 2 3 4 5]

Подсчет количества уникальных значений с помощью len(numpy.unique())

Чтобы получить количество уникальных значений, можно использовать функцию len() вместе с numpy.unique():

import numpy as np
from typing import List

def count_unique_values(arr: np.ndarray) -> int:
    """Возвращает количество уникальных значений в массиве NumPy."""
    unique_values: np.ndarray = np.unique(arr)
    return len(unique_values)

# Пример использования
data: np.ndarray = np.array([1, 2, 2, 3, 4, 4, 5])
unique_count: int = count_unique_values(data)
print(f"Количество уникальных значений: {unique_count}") # Output: Количество уникальных значений: 5

Использование аргумента return_counts для получения частоты встречаемости

Аргумент return_counts=True в функции numpy.unique() позволяет получить не только уникальные значения, но и частоту их встречаемости в исходном массиве. Это возвращает кортеж из двух массивов: первый содержит уникальные значения, а второй – их частоты.

import numpy as np
from typing import Tuple

def get_unique_values_with_counts(arr: np.ndarray) -> Tuple[np.ndarray, np.ndarray]:
    """Возвращает уникальные значения и их частоты в массиве NumPy."""
    unique_values, counts = np.unique(arr, return_counts=True)
    return unique_values, counts

# Пример использования
data: np.ndarray = np.array([1, 2, 2, 3, 4, 4, 5])
unique_values, counts = get_unique_values_with_counts(data)
print(f"Уникальные значения: {unique_values}") # Output: Уникальные значения: [1 2 3 4 5]
print(f"Частоты: {counts}") # Output: Частоты: [1 2 1 2 1]

Альтернативные подходы и оптимизация

Использование numpy.bincount() для целых чисел

Если массив содержит только неотрицательные целые числа, функция numpy.bincount() может быть более эффективной, чем numpy.unique() для подсчета частот. Она возвращает массив, где индекс соответствует значению, а значение элемента – количеству встречаемости этого значения в исходном массиве. Затем можно определить количество ненулевых элементов в полученном массиве.

Реклама
import numpy as np
from typing import Optional

def count_unique_values_bincount(arr: np.ndarray, max_value: Optional[int] = None) -> int:
    """Подсчитывает количество уникальных значений в массиве NumPy, используя bincount.

    Args:
        arr: Входной массив NumPy (должен содержать неотрицательные целые числа).
        max_value: Максимальное значение в массиве (опционально). Если не указано, будет вычислено.

    Returns:
        Количество уникальных значений.
    """
    if not np.issubdtype(arr.dtype, np.integer) or np.any(arr < 0):
        raise ValueError("Массив должен содержать неотрицательные целые числа.")

    if max_value is None:
        max_value = np.max(arr)

    bincounts = np.bincount(arr, minlength=max_value + 1)
    return np.count_nonzero(bincounts)

# Пример использования
data: np.ndarray = np.array([0, 1, 1, 2, 3, 2, 0, 4])
unique_count: int = count_unique_values_bincount(data)
print(f"Количество уникальных значений: {unique_count}") # Output: Количество уникальных значений: 5

Работа с многомерными массивами

Функция numpy.unique() также может работать с многомерными массивами. По умолчанию она рассматривает массив как одномерный, то есть сначала разворачивает массив в одномерный, а затем ищет уникальные элементы. Чтобы найти уникальные строки (или столбцы), можно использовать аргумент axis.

import numpy as np

def get_unique_rows(arr: np.ndarray) -> np.ndarray:
    """Возвращает уникальные строки из 2D массива NumPy."""
    return np.unique(arr, axis=0)

# Пример использования
data: np.ndarray = np.array([[1, 2], [3, 4], [1, 2], [5, 6]])
unique_rows: np.ndarray = get_unique_rows(data)
print(f"Уникальные строки:\n{unique_rows}")
# Output:
# Уникальные строки:
# [[1 2]
#  [3 4]
#  [5 6]]

Примеры использования и распространенные сценарии

Анализ данных: выявление уникальных категорий

Представим, что у вас есть массив данных о типах товаров, просмотренных пользователями на сайте:

import numpy as np

# Типы товаров, просмотренных пользователями
product_types: np.ndarray = np.array(['Электроника', 'Одежда', 'Электроника', 'Книги', 'Одежда'])

# Находим уникальные категории товаров
unique_categories: np.ndarray = np.unique(product_types)
print(f"Уникальные категории товаров: {unique_categories}") # Output: Уникальные категории товаров: ['Книги' 'Одежда' 'Электроника']

Фильтрация данных: отбор уникальных элементов

Допустим, у вас есть массив идентификаторов пользователей, и вам нужно оставить только уникальных пользователей:

import numpy as np

# Идентификаторы пользователей
user_ids: np.ndarray = np.array([101, 102, 101, 103, 102, 104])

# Отбираем уникальные идентификаторы пользователей
unique_user_ids: np.ndarray = np.unique(user_ids)
print(f"Уникальные идентификаторы пользователей: {unique_user_ids}") # Output: Уникальные идентификаторы пользователей: [101 102 103 104]

Заключение

Краткое повторение основных моментов

В этой статье мы рассмотрели, как находить количество уникальных значений в массивах NumPy. Мы изучили функцию numpy.unique(), ее аргумент return_counts и альтернативный метод numpy.bincount() для целых чисел. Также были рассмотрены примеры использования этих методов для анализа и фильтрации данных.

Дополнительные ресурсы и ссылки


Добавить комментарий