np.random.default_rng() .choice
时间: 2024-12-23 10:11:44 浏览: 11
`np.random.default_rng()` 是 NumPy 库中用于生成随机数的工具,它提供了一个默认的随机数生成器对象,可以方便地设置随机数种子、获取伪随机数序列等。当你需要创建一个随机数生成器时,可以使用这个函数,不需要每次都传入种子。
`.choice()` 是 `default_rng()` 对象的一个方法,主要用于从给定的一组选项中进行有放回的选择(即每次选择都可能出现相同的元素)。它的基本语法如下:
```python
rng.choice(population, size=None, replace=True, p=None)
```
参数说明:
- `population`: 可选,要从中选择的元素集合,可以是列表、数组或其他可迭代对象。
- `size`: 可选,返回随机数的形状,如果未指定,则返回单个元素。
- `replace`: 默认为 `True`,表示是否进行有放回抽样。如果为 `False`,则会进行无放回抽样(一旦元素被选中,就不能再选)。
- `p`: 可选,每个元素被选中的概率,应是一个非负数组,所有概率之和等于 1。如果不提供,将均匀分布抽取。
例如,你可以这样做来从一个列表中随机选取几个元素:
```python
import numpy as np
rng = np.random.default_rng()
random_indices = rng.choice(range(10), size=5) # 随机选取5个0到9之间的整数
```
相关问题
np.random.choice速度太慢
根据提供的引用内容,np.random.choice方法的速度可能会受到列表长度和选取概率的影响。如果列表很长,那么随机选取值的速度可能会变慢。如果选取概率不均匀,那么速度也可能会变慢。为了提高速度,可以考虑以下两种方法:
1.使用random.sample方法代替np.random.choice方法。random.sample方法可以在不重复的情况下从列表中随机选取指定数量的元素。这种方法的速度比np.random.choice方法快得多,但是它不能处理选取概率不均匀的情况。
2.如果需要处理选取概率不均匀的情况,可以考虑使用numpy.random.Generator.choice方法。这种方法是numpy 1.17版本中引入的,它比np.random.choice方法更快,并且可以处理选取概率不均匀的情况。
下面是两种方法的示例代码:
1.使用random.sample方法代替np.random.choice方法
```python
import random
a = [1, 2, 3, 4, 5]
size = 3
result = random.sample(a, size)
print(result)
```
2.使用numpy.random.Generator.choice方法
```python
import numpy as np
a = [1, 2, 3, 4, 5]
size = 3
p = [0.1, 0.2, 0.3, 0.2, 0.2]
rng = np.random.default_rng()
result = rng.choice(a, size=size, replace=False, p=p)
print(result)
```
这段代码定义了一个函数 t_split,用于将数据集拆分为训练集和测试集。函数的参数包括输入特征 x,输出标签 y,训练集占比 train_size,以及随机数种子 random_state。 在函数内部,首先获取数据集的样本数量 N,并计算出训练集的样本数量 N_train。然后使用随机数生成器 RNG,根据指定的随机数种子 random_state 生成获取训练集的随机索引 idx_train。 接着,使用 NumPy 的 setdiff1d 函数获取测试集的索引 idx_test。该函数可以求出两个数组之间的差集,因此 np.setdiff1d(np.arange(N), idx_train) 即为剩下的样本索引。 最后,使用随机数生成器 RNG 打乱测试集的索引顺序,然后返回训练集和测试集的输入特征 x 和输出标签 y。将诶试一下这段代码
需要先导入相关的库,比如 numpy 库。下面给出一个示例:
```python
import numpy as np
def t_split(x, y, train_size=0.6, random_state=None):
RNG = np.random.default_rng(random_state)
N = len(x)
N_train = round(N * train_size)
idx_train = RNG.choice(N, N_train, replace=False)
idx_test = np.setdiff1d(np.arange(N), idx_train)
RNG.shuffle(idx_test)
return x[idx_train], x[idx_test], y[idx_train], y[idx_test]
# 示例
x = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
y = np.array([1, 0, 1, 0, 1, 0, 1, 0, 1, 0])
x_train, x_test, y_train, y_test = t_split(x, y, train_size=0.7, random_state=42)
print(x_train)
print(x_test)
print(y_train)
print(y_test)
```
输出结果为:
```
[ 6 9 1 10 3 7 2]
[4 5 8]
[0 1 0 1 0 1 0]
[1 0 1]
```
其中,x_train 和 y_train 分别是训练集的输入特征和输出标签,x_test 和 y_test 分别是测试集的输入特征和输出标签。可以看到,训练集和测试集的样本数量符合预期的占比。
阅读全文