Почему простая смешанная базовая / расширенная индексация зависит от смежности срезов? - PullRequest
0 голосов
/ 19 декабря 2018

Я знаю, что подобные вопросы уже задавались ранее ( например ), но AFAIK никто не ответил на мой конкретный вопрос ...

Мой вопрос о numpyОписано смешанное расширенное / базовое индексирование здесь :

... Необходимо различать два случая комбинации индексов:

  • Расширенные индексы разделенысрезом, многоточием или новой осью.Например, x[arr1,:,arr2].
  • Расширенные индексы находятся рядом друг с другом.Например, x[...,arr1,arr2,:], но не x[arr1,:,1], поскольку 1 является расширенным индексом в этом отношении.

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

Почему это различие необходимо?

Я ожидал, что описанное поведение для случая 2 будет использоваться во всех случаях.Почему имеет значение, находятся ли индексы рядом друг с другом?

Я понимаю, что в некоторых ситуациях вам может понадобиться поведение случая 1;например, «векторизация» индекса приводит к новым измерениям.Но такое поведение может и должно быть определено пользователем.То есть, если поведение в случае 2 было по умолчанию, поведение в случае 1 было бы возможно, используя только: x[arr1,:,arr2].reshape((len(arr1),x.shape[1]))

Я знаю, что вы можете добиться поведения, описанного в случае 2, с использованием np.ix_(), но это несоответствие в поведении индексации по умолчанию является неожиданным и неоправданным, по моему мнению.Кто-нибудь может это оправдать?

Спасибо,

1 Ответ

0 голосов
/ 19 декабря 2018

Поведение для случая 2 не является четко определенным для случая 1. В следующем предложении, вероятно, отсутствует тонкость:

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

Вы, вероятно, представляете однозначное соответствие между входом и выходомразмеры, возможно, потому что вы представляете себе индексацию в стиле Matlab.NumPy так не работает.Если у вас есть четыре массива со следующими формами:

a.shape == (2, 3, 4, 5, 6)
b.shape == (20, 30)
c.shape == (20, 30)
d.shape == (20, 30)

, тогда a[b, :, c, :, d] имеет четыре измерения с длинами 3, 5, 20 и 30. Однозначного места для20 и 30. По умолчанию NumPy ставит их впереди.

С другой стороны, с a[:, b, c, d, :] 20 и 30 могут идти туда, где были 3, 4 и 5, потому что 34 и 5 были рядом друг с другом. целый блок новых измерений идет там, где был целый блок исходных размеров, который работает, только если исходные размеры были в одном блоке в исходной форме.

...