Нарезка матрицы для цикла for с индексом в python - PullRequest
1 голос
/ 11 октября 2019

У меня есть 3D-матрица, такая как:

array([[[3., 0., 0.],
        [0., 0., 0.],
        [0., 0., 0.]],
       [[0., 0., 0.],
        [2., 0., 0.],
        [0., 0., 0.]],
       [[0., 0., 0.],
        [12., 0., 0.],
        [0., 0., 0.]]])

Я хочу нарезать это на [:, 0,:], [-1 ,::] .. и все 6 направлений в порядкес петлей для. Таким образом, для каждого измерения, вырезая из первого (0) и последнего (-1).

Как правильно применять цикл for?

Предположим, имя массива A:

A[0, :, :]
A[:, :, 0]
A[:, 0, :]
A[-1, :, :]
A[:, -1, :]
A[:, :, -1]

Я хочу, чтобы эти 6 подматриц (скажем, в списке) были в одном цикле.

1 Ответ

2 голосов
/ 26 октября 2019

Не совсем понятно почему вы хотите это сделать, но вы можете динамически захватывать подмассивы, используя take:

import numpy as np
arr = np.arange(2*3*4).reshape(2, 3, 4)  # dummy input

arrays = [arr.take(index, axis) for axis in range(arr.ndim) for index in [0,-1]]

Этот списокМассивы будут содержать arr[0,:,:], arr[-1,:,:], arr[:,0,:], arr[:,-1,:] и т. д. в этом порядке. Вот доказательство для одного элемента в списке массивов:

>>> np.array_equal(arr[:,-1,:], arr.take(-1, 1))
True

Ваш вопрос не был слишком конкретным в отношении порядка, но вышеприведенное можно легко обобщить для произвольного упорядочения ваших требований к нарезке:

indices = [0, 0, 0, -1, -1, -1]
axes = [0, 2, 1, 0, 1, 2]
arrays = [arr.take(index, axis) for index,axis in zip(indices, axes)]

Это соответствует порядку подмассивов, как указано в вашем вопросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...