scipy.ndimage.

value_indices#

scipy.ndimage.value_indices(arr, *, ignore_value=None)[источник]#

Найти индексы каждого уникального значения в заданном массиве.

Параметры:
arrndarray целых чисел

Массив, содержащий целочисленные значения.

ignore_valueint, необязательный

Это значение будет проигнорировано при поиске arr массив. Если не задано, все найденные значения будут включены в вывод. По умолчанию None.

Возвращает:
индексысловарь

Словарь Python индексов массива для каждого уникального значения. Словарь ключами содержит уникальные значения, записи представляют собой кортежи индексов массива, охватывающие все вхождения значения в массиве.

Этот словарь может занимать значительный объём памяти, обычно в несколько раз больше размера входного массива.

Примечания

Для небольшого массива с несколькими различными значениями можно использовать numpy.unique() чтобы найти все возможные значения, и (arr == val) для определения местоположения каждого значения в этом массиве. Однако для больших массивов со многими различными значениями это может стать крайне неэффективным, так как определение местоположения каждого значения потребует нового поиска по всему массиву. Используя эту функцию, по сути выполняется один поиск, с сохранением индексов для всех различных значений.

Это полезно при сопоставлении категориального изображения (например, сегментации или классификации) с связанным изображением других данных, позволяя затем вычислить любую статистику для каждого класса. Предоставляет более гибкую альтернативу функциям, таким как scipy.ndimage.mean() и scipy.ndimage.variance().

Некоторые другие тесно связанные функции, с разными преимуществами и недостатками, также можно найти в scipy.stats.binned_statistic() и scikit-image функция skimage.measure.regionprops().

Примечание для пользователей IDL: это обеспечивает функциональность, эквивалентную опции REVERSE_INDICES в IDL (согласно документации IDL для ГИСТОГРАММА функция).

Добавлено в версии 1.10.0.

Примеры

>>> import numpy as np
>>> from scipy import ndimage
>>> a = np.zeros((6, 6), dtype=int)
>>> a[2:4, 2:4] = 1
>>> a[4, 4] = 1
>>> a[:2, :3] = 2
>>> a[0, 5] = 3
>>> a
array([[2, 2, 2, 0, 0, 3],
       [2, 2, 2, 0, 0, 0],
       [0, 0, 1, 1, 0, 0],
       [0, 0, 1, 1, 0, 0],
       [0, 0, 0, 0, 1, 0],
       [0, 0, 0, 0, 0, 0]])
>>> val_indices = ndimage.value_indices(a)

Словарь val_indices будет иметь запись для каждого уникального значения во входном массиве.

>>> val_indices.keys()
dict_keys([np.int64(0), np.int64(1), np.int64(2), np.int64(3)])

Запись для каждого значения представляет собой кортеж индексов, указывающий на элементы с этим значением.

>>> ndx1 = val_indices[1]
>>> ndx1
(array([2, 2, 3, 3, 4]), array([2, 3, 2, 3, 4]))

Это можно использовать для индексации в исходном массиве или любом другом массиве с той же формой.

>>> a[ndx1]
array([1, 1, 1, 1, 1])

Если нули игнорировать, то результирующий словарь больше не будет содержать запись для нуля.

>>> val_indices = ndimage.value_indices(a, ignore_value=0)
>>> val_indices.keys()
dict_keys([np.int64(1), np.int64(2), np.int64(3)])