以任意维数对numpy数组进行子采样

And*_*ffe 3 python arrays numpy

我有一个一n维的 numpy 数组(n原则上是未知的,但实际上它是一个很小的数字,通常n<=3)。我想对m每个方向的每个条目进行二次采样。所以对于二维数组,这将是

arr[::m, ::m]
Run Code Online (Sandbox Code Playgroud)

有没有办法将其概括为任意的n?(在实践中,我可以只检查值并使用上述的不同版本,但我怀疑有更优雅的方法)。

Bla*_*ear 5

使用切片:

In [1]: import numpy as np

In [2]: a = np.array(range(3*5*5)).reshape(3, 5, 5)

In [3]: a
Out[3]: 
array([[[ 0,  1,  2,  3,  4],
        [ 5,  6,  7,  8,  9],
        [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, 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]]])

In [4]: a[::2, ::2, ::2]
Out[4]: 
array([[[ 0,  2,  4],
        [10, 12, 14],
        [20, 22, 24]],

       [[50, 52, 54],
        [60, 62, 64],
        [70, 72, 74]]])

In [5]: a[[slice(None, None, 2)] * a.ndim]
Out[5]: 
array([[[ 0,  2,  4],
        [10, 12, 14],
        [20, 22, 24]],

       [[50, 52, 54],
        [60, 62, 64],
        [70, 72, 74]]])
Run Code Online (Sandbox Code Playgroud)