【问题标题】:How to create a set of random numbers with numpy如何使用 numpy 创建一组随机数
【发布时间】:2022-01-21 09:21:30
【问题描述】:

我的要求是创建一组随机数。我知道集合大小和随机数范围。因此:

import random
def makeset(lo, hi, ss):
  s = set()
  while len(s) < ss:
    s.add(random.randint(lo, hi))
  return s

我意识到 lo、hi 和 ss 的某些组合可能会导致不可能完成的任务,但这不在此处的范围内。

我已经开始学习 numpy 并且想知道该模块是否提供了可以在一个步骤中执行此操作的东西 - 即没有显式循环。

但我在文档中找不到任何内容。也许它不存在。

有什么想法吗?

【问题讨论】:

标签: python numpy


【解决方案1】:

您可以使用np.random.choice 无需替换,如下所示:

import numpy as np
gen = np.random.Generator(np.random.PCG64())
def with_numpy_gen(lo, hi, ss):
  return gen.choice(np.arange(lo, hi + 1), ss, replace=False)

【讨论】:

  • numpy.random.choice 效率极低 - 它构建输入数组的整个排列,然后对其进行切片以获取样本。由于向后兼容性保证,他们无法更改它。
  • numpy.random.Generator.choice 没有效率问题,但旧的 API 仍然在所有搜索结果中排在首位,而新的 API 有一个尴尬的要求,即强制您管理显式的 RNG 对象- 使用显式 RNG 是一种很好的做法,但很难让任何人都足够关心去做。
  • @user2357112supportsMonica 没关系,我认为我的基准测试已经关闭。似乎仍然可以使用生成器。
【解决方案2】:

我们可以使用np.random.default_rng

使用默认的 BitGenerator (PCG64) 构造一个新的生成器

import numpy as np
gen = np.random.default_rng()
def makeset(lo, hi, ss):
  return set(gen.choice(np.arange(lo, hi + 1), ss, replace=False))

【讨论】:

    猜你喜欢
    • 2011-08-15
    • 1970-01-01
    • 2015-11-17
    • 2012-10-31
    • 1970-01-01
    • 1970-01-01
    • 2020-10-21
    • 2019-09-22
    • 1970-01-01
    相关资源
    最近更新 更多