Размеры массива после многомерной индексации - PullRequest
0 голосов
/ 07 декабря 2018

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


Чтобы проиллюстрировать мою проблему, позвольте мне привести пример.Скажем, у нас есть массив 4D:

import numpy as np

a = np.arange(2*3*4*5).reshape(2,3,4,5)

Я создам кортеж индексов, используя numpy.where, для нарезки по осям 1 и 3:

mask = np.where(np.random.rand(3,5) > 0.5)

Это выберетслучайные кусочки из моего массива a.Допустим, он вернул кортежи длины 7. Чтобы сохранить оставшиеся размеры, я буду использовать slice(None) объекты:

b = a[(slice(None), mask[0], slice(None), mask[1])]

Это изменило форму:

>>> a.shape
(2, 3, 4, 5)
>>> b.shape
(7, 2, 4)

Оси, которые не были затронуты(то есть нарезка с использованием объекта slice(None)), по-видимому, была сохранена, в то время как нарезанные оси уничтожаются, а результирующая ось перемещается вперед.

Однако это не всегда так.Когда я применяю маску к осям 1 и 2:

mask2 = np.where(np.random.rand(3,4) > 0.5)
c = a[(slice(None), mask[0], mask[1], slice(None))]

, я наблюдаю следующее (numpy.where снова вернул кортежи длины 7):

>>> c.shape
(2, 7, 5)

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

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

1 Ответ

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

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

Ваши маски where создадут массив формы 1d (7,), если применить его к массиву 2d, то есть значениям, где условие выполняется.Вы формулируете это как «уничтожение» пары топоров.

Во втором случае 7 можно поместить между 2 и 5.

Но во-первых, это неоднозначно из-за среза в середине (не смежности) - правило отступления состоит в том, чтобы поставить его первым, а упорядочить срезы после.Другими словами, вместо того, чтобы пытаться выбирать между (2,7,4) и (2,4,7) порядком, он выбирает (7,2,4).

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

...