Я хочу нарезать многомерный массив кусочков (> 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)
Ось, полученная в результатена этот раз оси, которые были разрушены резкой, не двигались вперед.
Я предполагаю, что это связано с тем, являются ли нарезанные оси смежными или нет, но я хочу знать, по каким правилам возникает такое поведение.