有没有办法创建k个数字的n个随机整数。
例如..包含[0, 2, 3]
我的诀窍是使用随机数的生成器,然后根据范围分配值?
但是想知道在python中有没有更好的方法呢?
编辑: 实例:[0,0,0,2,2,3,0,0,2,2,...... 2000元素],包括0.2和3 我的方法
def assign(x):
if x< 0.3: return 0
elif x<0.6: return 2
else: return 3
x = np.random.rand(num)
x = map(lamdba x:assign(x),x)
答案 0 :(得分:3)
从它的声音来看,您似乎只想使用列表n
中找到的值生成长度为k
的序列。
Python的random.choice
函数与列表理解相结合是完美的。
以下函数将生成一个长度为n的列表,其中每个元素都是从k
中选择的随机元素。
from random import choice
def random_choices(n, k):
return [choice(k) for _ in xrange(n)]
这与简单列表理解相同。
from random import choice
foo = [choice(k) for _ in xrange(n)]
*感谢Mr.goosberry指出xrange
应该在python 3.x.x中替换为range
。
答案 1 :(得分:1)
现在,在您编辑之后,很清楚您想要什么。您希望对容器中的某些元素进行离散采样。
准备你的课程并做到这一点:
import numpy as np
classes = [0, 2, 3]
samples = np.random.choice(classes, 2000)
如果你想要一些特定的概率:
import numpy as np
classes = [0, 2, 3]
samples = np.random.choice(classes, 2000, p=[0.3, 0.3, 0.4])
请参阅docs。
实施应该比您的方法快得多,有时称为轮盘式采样或线性搜索采样。 wiki提到了一些可能的算法。
答案 2 :(得分:1)
您可以通过list comprehension
来实现。为了显示我使用20
的结果。根据您的要求将其更改为2000
。
>>> import random
>>> x = 20
>>> [random.choice([0, 2, 3]) for i in range(20)]
[2, 2, 3, 2, 0, 2, 3, 2, 3, 3, 3, 0, 3, 2, 3, 2, 3, 2, 3, 2]
答案 3 :(得分:1)
你愿意使用numpy,所以我建议你使用np.random.choice,即:
import numpy as np
N = 2000
print[np.random.choice([0, 2, 3], p=[1/3.0, 1/3.0, 1/3.0]) for x in range(N)]
答案 4 :(得分:0)
import numpy as np
N = 10
# Generate three vectors of n size
zeros = np.zeros((N,), dtype = np.int)
twos = np.zeros((N,), dtype = np.int) + 2
threes = np.zeros((N,), dtype = np.int) + 3
# Permutate all together
df = []
df = np.append(df, [zeros, twos, threes])
df_shuffled = np.random.shuffle(df)
print(df)