首页 > 解决方案 > 随机整数元素可能具有不同范围的数组行

问题描述

考虑以下代码片段:

import numpy as np

mask = np.array([True, True, False, True, True, False])
val = np.array([9, 3])
arr = np.random.randint(1, 9, size = (5,len(mask)))

正如预期的那样,我们得到一个随机整数数组,从 1 到 9,有 5 行和 6 列,如下所示。该val阵列尚未使用。

[[2, 7, 6, 9, 7, 5],
 [7, 2, 9, 7, 8, 3],
 [9, 1, 3, 5, 7, 3],
 [5, 7, 4, 4, 5, 2],
 [7, 7, 9, 6, 9, 8]]

现在我来介绍一下val = [9, 3]
在哪里mask = True,我希望从 1 到9随机取行元素。
在哪里mask = False,我希望从 1 到3随机抽取行元素。

如何有效地做到这一点?示例输出如下所示。

[[2, 7, 2, 9, 7, 1],
 [7, 2, 1, 7, 8, 3],
 [9, 1, 3, 5, 7, 3],
 [5, 7, 1, 4, 5, 2],
 [7, 7, 2, 6, 9, 1]]

标签: arraysnumpy

解决方案


一种想法是在 0 到 1 之间随机采样,然后与93相乘mask,最后1相加以移动样本。

rand = np.random.rand(5,len(mask))
is3 = (1-mask).astype(int)

# out is random from 0-8 or 0-2 depending on `is3`
out = (rand*val[is3]).astype(int)

# move out by `1`:
out = (out + 1)

输出:

array([[4, 9, 3, 6, 2, 1],
       [1, 8, 2, 7, 1, 3],
       [8, 2, 1, 2, 3, 2],
       [4, 3, 2, 2, 3, 2],
       [5, 8, 1, 5, 6, 1]])

推荐阅读