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

时间:2015-06-13 16:41:30

标签: python numpy random

我需要以给定的概率随机选择从列表中选择元组。

编辑: 每个元组的可能性都在概率清单中 我不知道忘记参数替换,默认情况下是none 使用数组而不是列表的相同问题

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

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)

错误是:

ValueError: a must be 1-dimensional

我该如何解决?

5 个答案:

答案 0 :(得分:7)

根据该职能部门的文件,

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)

所以关注

lista_elegir[np.random.choice(len(lista_elegir),1,p=probabilit)]

应该做你想做的事。 (根据评论添加了p=;如果值是统一的,则可以省略。)

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

答案 1 :(得分:3)

问题是元组列表被解释为2D数组,而choice仅适用于1D数组或整数(解释为"选择范围")。请参阅the documentation

因此解决此问题的一种方法是传递元组列表的len,然后选择具有相应索引(或索引)的元素,如other answer中所述。如果您先将lista_elegir转换为np.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]])

答案 2 :(得分:0)

我知道这则帖子很旧,但是请把它留在这里,以防万一其他人到此为止。

对我有用的是将列表转换为nparray。您以后随时可以将其转换回列表。

import numpy as np

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

lista_elegir_arr = np.array(lista_elegir)

#make sure probabilities sum to 1, and if they are all the same they are not needed
np.random.choice(lista_elegir_arr, numSamples, p = None)

答案 3 :(得分:0)

只需使用rundom

import random
import numpy as np

DIRECTIONS = [np.array([-1, 0]),
          np.array([0, 1]),
          np.array([1, 0]),
          np.array([0, -1])]

random.choice(DIRECTIONS)

结果得到了一个元组

答案 4 :(得分:0)

简单易懂的英文解决方案

numpy 版本 1.19.2

import numpy as np

probs = [.1, .2, .7]
vals = [(3, 0), (3, 1), (3, 2)]
n_samples = 5  # choose so may elements from vals

np.random.seed(1)  # fix random seed for reproducibility
inds = np.random.choice(len(vals), n_samples, p=probs)
rand_vals = [vals[ind] for ind in inds]
print(rand_vals)

输出

[(3, 2), (3, 2), (3, 0), (3, 2), (3, 1)]