首页 > 解决方案 > 如何通过随机选择 2x2 子数组中的元素来下采样 2D 数组?

问题描述

我有一个2n x 2m的numpy 数组。我想通过在划分我的初始数组的2 x 2非重叠子数组中随机选择一个元素来形成一个nxm数组。最好的方法是什么?有没有办法避免两个for循环(每个维度一个)?

例如,如果我的数组是

1 2 3 4
5 6 7 8
9 0 1 2
8 5 7 0

然后,有四个2 x 2子阵列对其进行分区:

1 2    3 4
5 6    7 8

9 0    1 2
8 5    7 0

我想在每个元素中随机选取一个元素来形成新的数组,例如

5 3  ,  6 8  ,  2 3
9 2     9 1     0 0  .

感谢您的时间。

标签: pythonnumpy

解决方案


这可以通过抽样来完成。我们不是对每个 2x2 正方形进行采样,而是将整个 ndarray 采样到 4 个单独的 ndarray 中,其中这些子数组中的相同索引将指向同一个 2x2 正方形。然后我们从这 4 个单独的 ndarray 中随机抽样:

# create test dataset
test = np.arange(36).reshape(6,6)

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]])

# Create subsamples from ndarray
samples = np.array([test[::2, ::2], test[1::2, 1::2], test[::2, 1::2], test[1::2, ::2]])
>>> samples
array([[[ 0,  2,  4],
        [12, 14, 16],
        [24, 26, 28]],

       [[ 7,  9, 11],
        [19, 21, 23],
        [31, 33, 35]],

       [[ 1,  3,  5],
        [13, 15, 17],
        [25, 27, 29]],

       [[ 6,  8, 10],
        [18, 20, 22],
        [30, 32, 34]]])

现在,这 4 个子样本中的每一个的相同索引都指向原始 ndarray 上的相同 2x2 正方形。我们只需要从同一个索引中随机选择:

# Random choice sampling between these 4 subsamples.
select = np.random.randint(4,size=(3,3))
>>> select
array([[2, 2, 1],
       [3, 1, 1],
       [3, 0, 0]])

result = select.choose(samples)
>>> result

array([[ 1,  3, 11],
       [18, 21, 23],
       [30, 26, 28]])

推荐阅读