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)]