【问题标题】:Getting an array from np random choice avoiding loops and error "a must be 1-dimensional"从 np 随机选择中获取数组,避免循环和错误“a must be 1-dimensional”
【发布时间】:2021-02-17 15:21:54
【问题描述】:

我正在尝试找到一种方法从 np.random.choise 获取值数组,使用值矩阵和概率之一,而不使用循环。

想象一下我有这样的东西

vals=  array([[ 0.        ,  1.22222222,  2.44444444,  3.66666667,  4.88888889,
         6.11111111,  7.33333333,  8.55555556,  9.77777778, 11.        ],
       [ 3.        ,  8.22222222, 13.44444444, 18.66666667, 23.88888889,
        29.11111111, 34.33333333, 39.55555556, 44.77777778, 50.        ]])

probs= array([[0.01056171, 0.15521083, 0.07796945, 0.09986356, 0.14516427,
        0.12496125, 0.00091384, 0.19739258, 0.00088116, 0.18708136],
       [0.01220221, 0.17791623, 0.13682813, 0.05679157, 0.16599396,
        0.09769565, 0.09365478, 0.15176203, 0.0965629 , 0.01059253]])

我怎样才能得到一个等价于这个的数组

[np.random.choice(vals[i],p=probs[i]) for i in range(len(probs))]

out[1]: 
[6.111111111111112, 23.88888888888889]

不使用 for 循环??

我希望 np.random.choice 按行广播矩阵,但我收到错误“a must be 1-dimensional”。

【问题讨论】:

  • 您只是想要那个,还是根据阅读文档而认真期待它?

标签: python numpy loops for-loop random


【解决方案1】:

我注意到 probs 的总和只是 1.0,所以不需要标准化。

要计算结果,请定义以下函数:

def rndFromRows(arr, probs):
    rowIdx = np.arange(arr.shape[0])
    colIdx = (probs.cumsum(1) > np.random.rand(probs.shape[0])[:,None]).argmax(1)
    return arr[(rowIdx, colIdx)]

或者更简洁的版本:

def rndFromRows(arr, probs):
    return arr[(np.arange(arr.shape[0]), (probs.cumsum(1) >
        np.random.rand(probs.shape[0])[:,None]).argmax(1))]

然后计算结果为:

np.random.seed(0)    # To get a repeatable result
result = rndFromRows(vals, probs)

我使用 %timeit 比较了执行时间,发现我的代码运行 比你的快大约 5 倍。自行比较。

结果是:

array([ 6.11111111, 34.33333333])

当然,在你的代码的最终版本中删除种子 随机生成器。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-15
    • 2022-07-09
    • 1970-01-01
    • 2021-02-12
    • 2023-01-04
    • 1970-01-01
    相关资源
    最近更新 更多