如何在元组列表中使用numpy.random.choice?

iva*_*rre 7 python random numpy

我需要随机选择具有从列表中选择元组的给定概率.

编辑:每个元组的概率是在概率列表我不知道忘记参数替换,默认是无同样的问题使用数组而不是列表

下一个示例代码给出了一个错误:

import numpy as np

probabilit = [0.333, 0.333, 0.333]
lista_elegir = [(3, 3), (3, 4), (3, 5)]

np.random.choice(lista_elegir, 1, probabilit)
Run Code Online (Sandbox Code Playgroud)

错误是:

ValueError: a must be 1-dimensional
Run Code Online (Sandbox Code Playgroud)

我怎么解决这个问题?

hpa*_*ulj 8

根据函数的文档,

a : 1-D array-like or int
    If an ndarray, a random sample is generated from its elements.
    If an int, the random sample is generated as if a was np.arange(n)
Run Code Online (Sandbox Code Playgroud)

所以那之后

lista_elegir[np.random.choice(len(lista_elegir),1,p=probabilit)]
Run Code Online (Sandbox Code Playgroud)

应该做你想做的事.(p=根据评论添加;如果值均匀,则可以省略).

它从[0,1,2]中选择一个数字,然后从列表中选择该元素.

  • 在 Python 3.6 中,当对多个项目进行采样时,上面给了我一个错误:`只有整数定标器数组可以转换为定标器索引`。这不能通过强制转换为 `int` 或使用 `range(len(x))` 而不是 `len(x)` 来解决。一种解决方案是使用内联 for 循环:`[x[i] for i in np.choice(len(x), n)]` 工作正常 (3认同)

tob*_*s_k 5

问题是元组列表被解释为二维数组,而choice仅适用于一维数组或整数(解释为“从范围中选择”)。请参阅文档

因此,解决此问题的一种方法是传递len元组列表的 ,然后选择具有相应索引(或多个索引)的元素,如另一个答案中所述。如果打开lista_elegirnp.array第一,这也将多个指标的工作。但是,还有两个问题:

首先,你调用函数,该方式probabilit将被解释为第三个参数replace作为的概率,即列表被解释为一个布尔值,这意味着你有更换选择,但实际的概率被忽略。您可以通过将第三个参数作为[1, 0, 0]. 使用p=probabilit来代替。其次,概率之和必须为 1,恰好。你的只是0.999。似乎您必须稍微倾斜概率,或者只是保留该参数,就None好像它们都相同(因此假设均匀分布)。

>>> probabilit = [0.333, 0.333, 0.333]
>>> lista_elegir = np.array([(3, 3), (3, 4), (3, 5)]) # for multiple indices
>>> indices = np.random.choice(len(lista_elegir), 2, p=probabilit if len(set(probabilit)) > 1 else None)
>>> lista_elegir[indices]
array([[3, 4],
       [3, 5]])
Run Code Online (Sandbox Code Playgroud)