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

Python 如何在元组列表中使用numpy.random.choice?,python,numpy,random,Python,Numpy,Random,我需要以给定的概率做一个随机选择,从列表中选择一个元组 编辑: 每个元组的概率在概率列表中 我不知道忘记参数替换,默认情况下是无 同样的问题是使用数组而不是列表 下一个示例代码给出了一个错误: 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) 错误是: Value

我需要以给定的概率做一个随机选择,从列表中选择一个元组

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

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

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

如何解决这个问题?

根据函数的文档

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]中选择一个数字,然后从列表中选择该元素。

问题是元组列表被解释为2D数组,而
choice
仅适用于1D数组或整数(解释为“从范围中选择”)。看

因此,解决这个问题的一种方法是传递元组列表的
len
,然后选择具有相应索引的元素,如中所述。如果首先将
lista_elegir
转换为
np.array
,这也适用于多个索引。然而,还有两个问题:

首先,调用函数的方式,
probabilit
将被解释为第三个参数,
replace
,而不是概率,即列表被解释为布尔值,这意味着您选择替换,但忽略实际概率。您可以通过将第三个参数作为
[1,0,0]
传递来轻松检查这一点。改用
p=probabilit
。第二,概率总和必须精确到1。你的密码只有
0.999
。似乎您必须稍微扭曲概率,或者如果它们都相同(因此假设均匀分布),则将该参数保留为
None


我知道这篇文章很老了,但是把它留在这里,以防其他人会到这里来

对我来说,一个有效的方法是将列表转换为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)
只是使用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)
结果得到了其中一个元组

一个简单的简明英语解答
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)]

如果您只想以相同的概率绘制元素,可以使用标准库中的
random.choice
。我的numpy版本错误,因此无法测试,但根据,您是否尝试将列表设置为numpy
数组
?另外,您似乎缺少第三个参数
replace
。在Python 3.6中,当对多个项目进行采样时,上面的参数会给我一个错误:
只有整数缩放器数组可以转换为缩放器索引。通过强制转换为
int
或使用
范围(len(x))
而不是
len(x)
来解决此问题。一种解决方案是使用内联for循环:
[x[i]代表np中的i。选择(len(x),n)]
有效fine@Scipio这是因为
lista\u elegir
是一个列表。使用
np.asarray(lista_elegir)
按索引访问。请注意,当您转换回时,它将是一个列表列表,而不是元组列表。您还必须执行转换的第二步。我运行了代码段,它给出了相同的错误:“ValueError:a必须是一维的”还得到了np的ValueError
[(3, 2), (3, 2), (3, 0), (3, 2), (3, 1)]