scipy 从沿着特定维度高维数组中随机采样

sqserrrh  于 2022-11-10  发布在  其他
关注(0)|答案(1)|浏览(116)

有一个三维数组x,其形状为(2000,60,5)。如果我们认为它代表一个视频,那么2000可以代表2000帧。我想沿着第一维对它进行随机采样,即得到一组帧样本。例如,如何沿着第一维从x随机采样得到(500,60,5)的数组?

eufgjt7s

eufgjt7s1#

可以将x作为choice方法的第一个参数传递。如果不希望样本中出现重复的帧,请使用replace=False
例如,

In [10]: x = np.arange(72).reshape(9, 2, 4)  # Small array for the demo.

In [11]: x
Out[11]: 
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]]])

使用NumPy随机生成器示例的choice方法从x中采样“帧”。

In [12]: rng = np.random.default_rng()

In [13]: rng.choice(x, size=3)
Out[13]: 
array([[[40, 41, 42, 43],
        [44, 45, 46, 47]],

       [[40, 41, 42, 43],
        [44, 45, 46, 47]],

       [[16, 17, 18, 19],
        [20, 21, 22, 23]]])

In [14]: rng.choice(x, size=3, replace=False)
Out[14]: 
array([[[ 8,  9, 10, 11],
        [12, 13, 14, 15]],

       [[32, 33, 34, 35],
        [36, 37, 38, 39]],

       [[ 0,  1,  2,  3],
        [ 4,  5,  6,  7]]])

注意,帧将是随机顺序的;如果要保持顺序,可以使用choice生成一个索引数组,然后使用排序后的索引从x中取出帧。

相关问题