在numpy数组中每N个元素中随机选取一个元素

2024-05-16 08:20:28 发布

您现在位置:Python中文网/ 问答频道 /正文

如何为numpy 1D数组中的每N个元素随机选取一个元素

例如,我有一个numpy数组[1,2,3,4,5,6,7,8,9,10],我想在每两个元素中随机选取一个元素。一个例子是[1,4,5,7,10],这意味着1[1,2]中随机选择,4[3,4]中随机选择,依此类推

我试图重塑和洗牌的数组,但我无法找到一个优雅的方式来做它没有一个循环


Tags: numpy元素方式数组例子重塑
1条回答
网友
1楼 · 发布于 2024-05-16 08:20:28

对于可被窗口/组长度整除的长度,我们可以将长度重塑为列数的2D数组,然后每行选择一个随机元素-

def random_pick(a, W):
    b = a.reshape(-1,W)
    idx = np.random.randint(0,b.shape[1], len(b))
    return b[np.arange(len(idx)), idx]

样本运行-

In [17]: a
Out[17]: array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])

In [18]: np.random.seed(0)

In [19]: random_pick(a, W=2)
Out[19]: array([ 1,  4,  6,  7, 10])

紧凑型版本

这也转化为更紧凑的版本-

In [81]: W = 2

In [82]: np.random.seed(0)

In [83]: a[np.random.randint(0,W,len(a)//W) + np.arange(0,len(a),W)]
Out[83]: array([ 1,  4,  6,  7, 10])

通用窗口长度

为了使其通用,以便任何窗口长度都可以输入,它将修改为-

def random_pick_generic(a, W):
    L = W*(len(a)//W)
    b = a[:L].reshape(-1,W)
    idx = np.random.randint(0,b.shape[1], len(b))
    out = b[np.arange(len(idx)), idx]
    if len(a[L:])>0:
        out = np.r_[out, np.random.choice(a[L:])]
    return out

样本运行-

In [50]: a
Out[50]: array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10])

In [51]: np.random.seed(0)

In [52]: random_pick_generic(a, W=2)
Out[52]: array([ 1,  4,  6,  7, 10])

In [53]: np.random.seed(0)

In [54]: random_pick_generic(a, W=3)
Out[54]: array([ 1,  5,  7, 10])

扩展到3D案例:[批量大小、时间步长、通道]

假设可分割窗口长度random_pick的解决方案将修改为-

b = a.reshape(-1,a.shape[1]//W,W,a.shape[2])
idx = np.random.randint(0,b.shape[2], b.shape[1])
out = b[:,np.arange(len(idx)), idx]

相关问题 更多 >