Почему использование массива в качестве индекса меняет форму многомерного ndarray? - PullRequest
4 голосов
/ 24 апреля 2019

У меня есть 4-D массив NumPy, с осью, скажем, x, y, z, t.Я хочу взять срез, соответствующий t = 0, и переставить порядок по оси Y.

У меня есть следующее

import numpy as np
a = np.arange(120).reshape(4,5,3,2)
b = a[:,[1,2,3,4,0],:,0]
b.shape

Я получаю (5, 4, 3) вместо(4,5,3).

Когда вместо этого я ввожу

aa = a[:,:,:,0]
bb = aa[:,[1,2,3,4,0],:]
bb.shape

, я получаю ожидаемое (4,5,3).Может кто-нибудь объяснить, почему в первой версии меняются первые два измерения?

1 Ответ

2 голосов
/ 24 апреля 2019

Как упомянуто в комментариях @hpaulj, это происходит из-за смешивания базовых срезов и расширенного индексирования :

a = np.arange(120).reshape(4,5,3,2)
b = a[:,[1,2,3,4,0],:,0]

В приведенном фрагменте кода,происходит следующее:

  • , когда мы выполняем базовое разрезание по последнему измерению, запускается вызов __getitem__.Итак, это измерение исчезло.(т. е. нет одноэлементного измерения)
  • [1,2,3,4,0] возвращает 5 срезов из второго измерения.Есть две возможности поместить эту форму в возвращаемый массив: либо в первую, либо в последнюю позицию.NumPy решил поставить его на первое измерение.Вот почему вы получаете 5 (5, ...) в первой позиции в возвращенном кортеже фигур.Хайме объяснил это в одном из разговоров PyCon, если я правильно помню.

  • Вдоль первого и третьего измерения, поскольку вы нарезаете все, используя :, первоначальная длина по этим измерениям сохраняется.

Собрав все это вместе, NumPy возвращает кортеж формы в виде: (5, 4, 3)

Подробнее об этом можно прочитать на numpy-indexing-ambiguity-in-3d-массивы и arrays.indexing # комбинирование-расширенное-и-базовое индексирование

...