具有交替的高级3D numpy阵列切片

mw3dktmi  于 2023-01-20  发布在  其他
关注(0)|答案(2)|浏览(120)

所以,我想对我的3d数组进行切片,跳过前两个数组,然后返回下两个数组。我希望切片保持这种模式,交替跳过2个数组和给出2个数组等。我已经找到了一个解决方案,但我想知道是否有一个更优雅的方法来实现这一点?最好是不必重新整形?

arr = np.arange(1, 251).reshape((10, 5, 5))
sliced_array = np.concatenate((arr[2::4], arr[3::4]), axis=1).ravel().reshape((4, 5, 5))
h79rfbju

h79rfbju1#

您可以使用重复[False, False, True, True, ...]的掩码进行布尔索引:

import numpy as np

arr = np.arange(1, 251).reshape((10, 5, 5))
mask = np.arange(arr.shape[0]) % 4 >= 2

out = arr[mask]

输出:

array([[[ 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,  87,  88,  89,  90],
        [ 91,  92,  93,  94,  95],
        [ 96,  97,  98,  99, 100]],

       [[151, 152, 153, 154, 155],
        [156, 157, 158, 159, 160],
        [161, 162, 163, 164, 165],
        [166, 167, 168, 169, 170],
        [171, 172, 173, 174, 175]],

       [[176, 177, 178, 179, 180],
        [181, 182, 183, 184, 185],
        [186, 187, 188, 189, 190],
        [191, 192, 193, 194, 195],
        [196, 197, 198, 199, 200]]])
wfsdck30

wfsdck302#

由于您希望选择并跳过相同的数字,因此整形可以起作用。
对于一维阵列:

In [97]: np.arange(10).reshape(5,2)[1::2]
Out[97]: 
array([[2, 3],
       [6, 7]])

然后可将其拆散。
泛化到更多维度:

In [98]: x = np.arange(100).reshape(10,10)    
In [99]: x.reshape(5,2,10)[1::2,...].reshape(-1,10)
Out[99]: 
array([[20, 21, 22, 23, 24, 25, 26, 27, 28, 29],
       [30, 31, 32, 33, 34, 35, 36, 37, 38, 39],
       [60, 61, 62, 63, 64, 65, 66, 67, 68, 69],
       [70, 71, 72, 73, 74, 75, 76, 77, 78, 79]])

我不会继续3d,因为显示器会更长,但它应该是直向前的。

相关问题