我有一个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个子矩阵(在列表中说出来)放在一个循环中。
答案 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)]
这与您的问题中指定的子数组的顺序匹配。