Многомерные массивы транспонируют себя без запроса

#python #numpy

#python #numpy

Вопрос:

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

когда я запускаю:

 ells=np.array([1,2,3,4])

check=np.zeros((2,2,2,len(ells)))
print(check[:,:,:,ells<=4].shape)
print(check[0,:,:,ells<=4].shape)
  

Я действительно могу решить эту проблему, используя

 ells=np.array([1,2,3,4])

check=np.zeros((2,2,2,len(ells)))
print(check[:,:,:,ells<=4].shape)
print(check[0,:,:,:][:,:,ells<=4].shape)
  

однако я хотел бы понять, почему первая версия неверна.

В первом случае я ожидаю получить массивы формы (2,2,2,4) и (2,2,4), но я получаю (2,2,2,4) и (4,2,2).

Во втором случае я получаю ожидаемые ответы (2,2,2,4) и (2,2,4).

Ответ №1:

Это пример смешанного расширенного и базового индексирования:

https://docs.scipy.org/doc/numpy-1.16.1/reference/arrays.indexing.html#combining-advanced-and-basic-indexing

Два внешних индекса выбирают размер 4, а два внутренних фрагмента добавляются после этого:

 check[0,:,:,ells<=4]
  

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

Я уверен, что кто-то мог бы найти дубликат SO.