Почему изменяется порядок измерений с булевской индексацией?

Когда мы имеем M формы (a, b, c) и индексный массив v которые мы используем для индексации последнего массива, почему M[i, :, v] приводит к массиву формы (d, b) ( с d число истинных значений в v )? Как показано ниже:

 In [409]: M = zeros((100, 20, 40)) In [410]: val = ones(shape=(40,), dtype="bool") In [411]: M[0, :, :].shape Out[411]: (20, 40) # As expected In [412]: M[0, :, val].shape Out[412]: (40, 20) # Huh? Why (40, 20), not (20, 40)? In [413]: M[:, :, val].shape Out[413]: (100, 20, 40) # s expected again 

Почему M[0, :, val] имеют форму (40, 20) а не (20, 40) ?

One Solution collect form web for “Почему изменяется порядок измерений с булевской индексацией?”

Согласно разделу boolean indexing документов http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#boolean-array-indexing

Объединение нескольких булевых индексирующих массивов или булевых с целым индексирующим массивом лучше всего понять с помощью аналогии obj.nonzero ().

 ind = np.nonzero(val)[0] # array([ 0, 1, 2, ...., 39], dtype=int32) M[0, :, ind].shape # (40,20) 

Итак, теперь мы переходим к разделу о объединении расширенного и базового индексирования http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#combining-advanced-and-basic-indexing

Это случай формы: x[arr1, :, arr2]

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

Таким образом, часть 0 и ind производит выбор (40,) , а : в середине получается (20,) . Помещая последнюю часть, (40,20) размер (40,20) . В основном это происходит из-за двусмысленности в этом стиле индексирования, поэтому он последовательно выбирает часть среза в конце.

Способ выбора этих значений и сохранения желаемой формы (более или менее) заключается в использовании np.ix_ для генерации кортежа индексов.

 M[np.ix_([0],np.arange(20),ind)].shape # (1, 20, 40) 

Вы можете использовать np.squeeze чтобы удалить начальное измерение 1 .

Это использование ix_ проиллюстрировано в конце раздела «индексирование чисто индексации» http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#purely-integer-array-indexing

  • Индексирование чисел: возвращение остальных
  • Поиск суммы столбца в списке Получение «TypeError: невозможно выполнить сокращение с помощью гибкого типа»
  • rgb_to_hsv и обратно с использованием python и numpy
  • Добавление столбца в numpy_array Python
  • Python Numpy: np.int32 «медленнее», чем np.float64
  • Регрессия по размеру в массиве numpy
  • Эффективная и pythonic проверка для сингулярной матрицы
  • Итерация через все одномерные подмассивы многомерного массива
  • Гаус-Лежандр с интервалами -x -> бесконечность: адаптивный алгоритм для эффективного преобразования весов и узлов
  • Как квадрат или поднять к мощности (по-разному) массив 2D numpy?
  • SciPy и scikit-learn - ValueError: несоответствие размеров
  • Python - лучший язык программирования в мире.