如何通过随机选择2×2子数组中的元素来对2D数组进行下采样?

前端之家收集整理的这篇文章主要介绍了如何通过随机选择2×2子数组中的元素来对2D数组进行下采样? 前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我有一个2n x 2m的numpy数组.我想通过在2 x 2个不重叠的子数组中随机选择一个元素来构成一个n x m数组,这些子数组对我的初始数组进行分区.最好的方法是什么?有没有办法避免两个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  .

感谢您的时间.

最佳答案
这可以通过采样完成.而不是对每个2×2正方形进行采样,我们将整个ndarray采样为4个单独的ndarray,这些子数组中的相同索引将指向同一2×2正方形.然后,我们从这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,::2]])
>>> samples
array([[[ 0,4],16],28]],[[ 7,[19,[31,35]],[[ 1,[13,[25,29]],[[ 6,10],22],34]]])

现在,这4个子样本中每个样本的相同索引指向原始ndarray上相同的2×2平方.我们只需要从相同的索引中随机选择:

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

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

array([[ 1,28]])

猜你在找的Python相关文章