Скажем, у меня есть 3D numpy.array, например. с размерами x y z, есть ли способ перебрать срезы вдоль определенной оси? Нечто подобное:итерация по срезам ndarray
for layer in data.slices(dim=2):
# do something with layer
Редактировать: Для того, чтобы уточнить, пример является тусклым = 3 массива, т.е. форма = (len_x, len_y, len_z). Elazar и, что то же самое, решения kamjagin работают, но не являются общими - вам нужно построить [:, :, i]
вручную, что означает, что вам нужно знать размеры, а код недостаточно общий для обработки массивов произвольных размеров. Вы можете заполнить отсутствующий размер, используя что-то вроде [..., :]
, но снова вам все равно придется построить это самостоятельно.
Извините, должно быть, было яснее, пример был слишком простым!
ЗАКАНЧИВАТЬ HTTP : //stackoverflow.com/questions/1589706/iterating-over-arbitrary-dimension-of-numpy-array. Метод swapaxes является самым быстрым, но наименее понятным. Подход kamjagin может быть обобщен путем построения кортежа для перехода в скобки (например, 'data [кортеж (slice (None), slice (None), i)]' такой же, как 'data [:,:, i] '). – AFoglia
@AFoglia Я не думаю, что тайминги по этому вопросу очень актуальны. Использование 'swapaxes' или' rollaxis' займет немного больше времени при настройке цикла, но фактические итерации будут быстрее, см. Тайминги, добавленные к моему ответу. В вашем очень маленьком примере настройка была доминирующей над фактической итерацией. Я не согласен с читабельностью, но я могу быть слишком привык к numpy, чтобы заметить это. – Jaime
@AFoglia numpy имеет аккуратный трюк для создания среза (кортежей) отдельно от объекта, который они должны индексировать: 'numpy.s _ [:,:, i]' эквивалентно 'tuple (slice (None), slice (None), i). – JAB