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

Когда мы имеем 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

  • Координаты текстуры около 1 ведут себя странно
  • Массив Numpy, как выбрать индексы, удовлетворяющие нескольким условиям?
  • Преобразование данных в Pandas непосредственно в Матрицу Sparse Numpy
  • Графический 2D-массив
  • Вычислить нормальную форму матрицы Джорда в Python / NumPy
  • Интегрирование многомерного интеграла в scipy
  • Массив фиксированного размера SWIG Python, переданный по ссылке
  • Добавить массив NumPy в массив NumPy
  • Python - лучший язык программирования в мире.