Python 从numpy数组中提取所有垂直切片
我想使用ndemerate或类似的工具从3D numpy数组中提取一个完整的切片Python 从numpy数组中提取所有垂直切片,python,numpy,Python,Numpy,我想使用ndemerate或类似的工具从3D numpy数组中提取一个完整的切片 arr = np.random.rand(4, 3, 3) 我想提取所有可能的arr[:,x,y],其中x,y范围从0到2 [arr[:, x, y] for x in range(3) for y in range(3)] ndindex是生成与形状对应的索引的便捷方法: In [33]: arr = np.arange(36).reshape(4,3,3) In [34]: for xy in np.ndi
arr = np.random.rand(4, 3, 3)
我想提取所有可能的arr[:,x,y],其中x,y范围从0到2
[arr[:, x, y] for x in range(3) for y in range(3)]
ndindex
是生成与形状对应的索引的便捷方法:
In [33]: arr = np.arange(36).reshape(4,3,3)
In [34]: for xy in np.ndindex((3,3)):
...: print(xy, arr[:,xy[0],xy[1]])
...:
(0, 0) [ 0 9 18 27]
(0, 1) [ 1 10 19 28]
(0, 2) [ 2 11 20 29]
(1, 0) [ 3 12 21 30]
(1, 1) [ 4 13 22 31]
(1, 2) [ 5 14 23 32]
(2, 0) [ 6 15 24 33]
(2, 1) [ 7 16 25 34]
(2, 2) [ 8 17 26 35]
它使用nditer
,但与嵌套的for循环对相比,没有任何速度优势
In [35]: for x in range(3):
...: for y in range(3):
...: print((x,y), arr[:,x,y])
ndenumerate
使用arr.flat
作为迭代器,但使用它
In [38]: for xy, _ in np.ndenumerate(arr[0,:,:]):
...: print(xy, arr[:,xy[0],xy[1]])
做同样的事情,迭代3x3子阵列的元素。与ndindex
一样,它生成索引。元素不是您想要的大小为4的数组,因此我忽略了这一点
另一种方法是展平后面的轴,转置,然后在(新的)第一个轴上迭代:
In [43]: list(arr.reshape(4,-1).T)
Out[43]:
[array([ 0, 9, 18, 27]),
array([ 1, 10, 19, 28]),
array([ 2, 11, 20, 29]),
array([ 3, 12, 21, 30]),
array([ 4, 13, 22, 31]),
array([ 5, 14, 23, 32]),
array([ 6, 15, 24, 33]),
array([ 7, 16, 25, 34]),
array([ 8, 17, 26, 35])]
或者像以前一样打印:
In [45]: for a in arr.reshape(4,-1).T:print(a)