如何在使用Python的numpy随机选择时指定随机种子?

12

我有一个包含四个字符串的列表。然后在Pandas数据框中,我想创建一个变量,随机从此列表中选择一个值并分配到每一行。我正在使用numpy的random choice,但是阅读他们的文档,发现没有种子选项。如何指定随机种子以进行随机分配,以便每次随机分配都相同?

service_code_options = ['899.59O', '12.42R', '13.59P', '204.68L']
df['SERVICE_CODE'] = [np.random.choice(service_code_options ) for i in df.index]
3个回答

10

在使用之前,您需要通过numpy.random.seed进行定义。此外,列表推导式并不是必需的,因为可以使用带有参数sizenumpy.random.choice

np.random.seed(123)

df = pd.DataFrame({'a':range(10)})

service_code_options = ['899.59O', '12.42R', '13.59P', '204.68L']
df['SERVICE_CODE'] = np.random.choice(service_code_options, size=len(df))
print (df)
   a SERVICE_CODE
0  0       13.59P
1  1       12.42R
2  2       13.59P
3  3       13.59P
4  4      899.59O
5  5       13.59P
6  6       13.59P
7  7       12.42R
8  8      204.68L
9  9       13.59P

“np.random.seed(123)” 这个代码会影响到调用 numpy 中随机函数的所有后续代码吗?如果是,有没有办法终止它呢?比如说,如果我想使用另一个不同的种子来创建另一个变量,我需要声明另一个 “np.random.seed(897)” 来影响后续代码吗? - KubiK888
1
在这里找到了答案 https://dev59.com/U1UL5IYBdhLWcg3wr5t6。谢谢。 - KubiK888
@KubiK888 - 很抱歉,我不在线。 - jezrael

3

Documentation numpy.random.seed

np.random.seed(this_is_my_seed)

这可以是一个整数或整数列表

np.random.seed(300)

或者

np.random.seed([3, 1415])

示例

np.random.seed([3, 1415])

service_code_options = ['899.59O', '12.42R', '13.59P', '204.68L']
np.random.choice(service_code_options, 3)

array(['899.59O', '204.68L', '13.59P'], dtype='<U7')

请注意,我向choice函数传递了一个3来指定数组的大小。 numpy.random.choice

整数列表会做什么?在 n 次 random() 调用后,使用第 n 个元素作为种子? - Guimoute
除了提供不同的种子外,没有什么特别的。 - piRSquared
是的,但列表是否按顺序解析? - Guimoute
1
不,整个列表只是提供随机化的起点。 - piRSquared

3
根据numpy v1.2.4中numpy.random.seed的注释:

最佳实践是使用专用的Generator实例,而不是直接在随机模块中公开的随机变量生成方法。

可以使用np.random.default_rng构建这样的Generator

因此,当前最佳实践是使用带有种子的np.random.default_rng构造一个Generator,而不是使用np.random.seed,以获得可重复的结果。

结合jezrael的答案和当前的最佳实践,我们有:

import pandas as pd 
import numpy as np 

rng = np.random.default_rng(seed=121)

df = pd.DataFrame({'a':range(10)})

service_code_options = ['899.59O', '12.42R', '13.59P', '204.68L']
df['SERVICE_CODE'] = rng.choice(service_code_options, size=len(df))

print(df)

   a SERVICE_CODE
0  0       12.42R
1  1       13.59P
2  2       12.42R
3  3       12.42R
4  4      899.59O
5  5      204.68L
6  6      204.68L
7  7       13.59P
8  8       12.42R
9  9       13.59P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接