Работая в NumPy, я понимаю, как нарезать 2D-массивы из 3D-массива, используя в этой статье .
В зависимости от оси, которую я хочу нарезать:
array = [[[0 1 2]
[3 4 5]
[6 7 8]]
[[9 10 11]
[12 13 14]
[15 16 17]]
[[18 19 20]
[21 22 23]
[24 25 26]]]
Нарезка даст мне:
i_slice = array[0]
[[0 1 2]
[3 4 5]
[6 7 8]]
j_slice = array[:, 0]
[[0 1 2]
[9 10 11]
[18 19 20]]
k_slice = array[:, :, 0]
[[0 3 6]
[9 12 15]
[18 21 24]]
Но можно ли нарезатьпод углом 45 градусов? , например:
j_slice_down = array[slice going down starting from index 0]
[[0 1 2]
[12 13 14]
[24 25 26]]
Я смог добиться этого во всех 3-х осях, идущих вверх или вниз, и даже оборачивая все вокруг ... в темном спискедней с большим количеством циклов for ... но я уверен, что в NumPy должен быть лучший путь.
Обновление, выбранный ответ:
Я выбрал ответ hpaulj, создав два координатных массива с np.arrange
.Немного поработав, я смог сделать так, чтобы он соответствовал моим потребностям - возвращать срез под любым углом, по любой оси, асимметричным измерением трехмерного массива и в любой позиции, включая обтекание по всей длине, чтобы оно было одинаковым.как ось.
Два np.arrange
массива были сделаны для x
и y
.
Различные методы, такие как np.roll
, инкремент, np.hstack
и np.concatenate
, были выполнены для массива np.arrange
массива оси x.y = y[::-1]
для альтернативного угла.
if axis is 'z': #i
slice_notation = np.index_exp[x, y, :]
elif axis is 'y': #k
slice_notation = np.index_exp[x, :, y]
else: #j
slice_notation = np.index_exp[:, x, y]
Создает выражение среза, затем я использую slice_notation
для выполнения необходимых операций на месте.
Другие предложенные методы: np.diagonal
и np.eye
могут быть более подходящими для других, хотя они могут иметь другие требования, чем я.