类似于这个问题,假设我有一个3D Numpy数组,为了清晰起见,我在上面添加了一个注释标签:
#C C C R R C C C R R C C C
a = [[[10,11,12,13,14,15,16,17,18,19,20,21,22],
[23,24,25,26,27,28,29,30,31,32,33,34,35]],
[[36,37,38,39,40,41,42,43,44,45,46,47,48],
[48,49,50,51,52,53,54,55,56,57,58,59,60]],
[[61,62,63,64,65,66,67,68,69,70,71,72,73],
[74,75,76,77,78,79,80,81,82,83,84,85,86]]]
我可以删除一行代码中标记为R
的列吗?因此,从索引3开始,每五个元素删除两列。在这种情况下,得到的数组如下所示:
#C C C C C C C C C
a = [[[10,11,12,15,16,17,20,21,22],
[23,24,25,28,29,30,33,34,35]],
[[36,37,38,41,42,43,46,47,48],
[48,49,50,53,54,55,58,59,60]],
[[61,62,63,66,67,68,71,72,73],
[74,75,76,79,80,81,84,85,86]]]
我想让代码更通用,这样它就可以处理删除不同大小和位置的3D阵列中的列对。对于这个例子,我可以使用以下方法一次删除一列:
start = 3
step = 5
a = numpy.delete(big, numpy.s_[start:numpy.size(big, 2):step], 2)
a = numpy.delete(a, numpy.s_[start:numpy.size(a, 2):step - 1], 2)
但是,有没有一种方法可以指定一系列要删除的列,从而在一行代码中完成任务?
与linked posted answer there
-非常相似
In [4]: a[...,np.mod(np.arange(a.shape[-1]),5)<3]
Out[4]:
array([[[10, 11, 12, 15, 16, 17, 20, 21, 22],
[23, 24, 25, 28, 29, 30, 33, 34, 35]],
[[36, 37, 38, 41, 42, 43, 46, 47, 48],
[48, 49, 50, 53, 54, 55, 58, 59, 60]],
[[61, 62, 63, 66, 67, 68, 71, 72, 73],
[74, 75, 76, 79, 80, 81, 84, 85, 86]]])
或更短的
a[...,(np.arange(a.shape[-1])%5)<3]
使其通用化/参数化-
group_size = 5
ignore_size = 2
out = a[...,(np.arange(a.shape[-1])%group_size)<(group_size-ignore_size)]
只需选择您想要的索引:
a=a[:,:,[0,1,2,5,6,7,10,11,12]]
或者,用一种更通用的方式:
a=a[:,:,[i for i in range(13) if i%5 in [0,1,2]]]
输出:
array([[[10, 11, 12, 15, 16, 17, 20, 21, 22],
[23, 24, 25, 28, 29, 30, 33, 34, 35]],
[[36, 37, 38, 41, 42, 43, 46, 47, 48],
[48, 49, 50, 53, 54, 55, 58, 59, 60]],
[[61, 62, 63, 66, 67, 68, 71, 72, 73],
[74, 75, 76, 79, 80, 81, 84, 85, 86]]])