在Python中用索引在for循环中切片矩阵

时间:2019-10-11 15:32:57

标签: python arrays numpy indexing

我有一个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个方向上按for循环切片。因此,对于每个维度,从第一个(0)和最后一个(-1)进行切片。

应用for循环的正确方法是什么?

让我们假设数组的名称为A

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

我希望将这6个子矩阵(在列表中说出来)放在一个循环中。

1 个答案:

答案 0 :(得分:2)

目前尚不清楚您为什么要这么做,但是您可以使用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)]

这与您的问题中指定的子数组的顺序匹配。