【问题标题】:np.random.rand vs np.random.randomnp.random.rand 与 np.random.random
【发布时间】:2017-11-10 22:05:58
【问题描述】:

我发现 Python(及其生态系统)充满了奇怪的约定和不一致,这是另一个例子:

np.random.rand

创建一个给定形状的数组,并用 [0, 1) 上均匀分布的随机样本填充它。

np.random.random

返回半开区间 [0.0, 1.0) 内的随机浮点数。结果来自规定区间内的“连续均匀”分布。

???到底有什么区别?

【问题讨论】:

标签: python numpy


【解决方案1】:

首先注意numpy.random.random实际上是numpy.random.random_sample的别名。我将在下面使用后者。 (更多别名请参见this question and answer。)

这两个函数都从 [0, 1) 上的 uniform distribution 生成样本。唯一的区别在于如何处理参数。对于numpy.random.rand,输出数组的每个维度的长度是一个单独的参数。对于numpy.random.random_sample,shape 参数是一个元组。

例如,要创建一个形状为 (3, 5) 的样本数组,您可以这样写

sample = np.random.rand(3, 5)

sample = np.random.random_sample((3, 5))

(真的,就是这样。)


更新

从 1.17 版开始,NumPy 有一个新的random API。从 [0, 1) 上的均匀分布生成样本的推荐方法是:

>>> rng = np.random.default_rng()  # Create a default Generator.
>>> rng.random(size=10)  # Generate 10 samples.
array([0.00416913, 0.31533329, 0.19057857, 0.48732511, 0.40638395,
       0.32165646, 0.02597142, 0.19788567, 0.08142055, 0.15755424])

新的Generator 类没有rand()random_sample() 方法。 一个uniform() 方法允许您指定分布的下限和上限。例如

>>> rng.uniform(1, 2, size=10)
array([1.75573298, 1.79862591, 1.53700962, 1.29183769, 1.16439681,
       1.64413869, 1.7675135 , 1.02121057, 1.37345967, 1.73589452])

numpy.random 命名空间中的旧函数将继续工作,但它们被视为“冻结”,没有持续开发。如果您正在编写新代码,并且您不必支持 numpy 1.17 之前的版本,建议您使用新的随机 API。

【讨论】:

  • 对,所以其实没有区别。我想知道为什么我们有两个不同名称的函数做同样的事情。恕我直言,他们应该清理这个。
  • 这些有历史原因,可能与 Matlab 程序员更容易过渡到 Python+Numpy 有关(c.f. Matlab's rand)。清理它可能会带来更多麻烦,因为可能有很多现有代码使用不同版本的函数。
  • 看起来 Python 的社区价值观“快速破解因为它对我来说很容易”超过了一致性。最好的例子是 matplotlib 在创建子图时使用“112”之类的数字来表示 (1,1,2) 的约定。无论如何,感谢您的回答。
  • 实际上,@WarrenWeckesser 关于不清理它可能是正确的。也就是说,当我试图记住 np.zeros((tuple dimensions arg))np.random.randn(dim1, dim2, dim3) 的参数参数的差异时,我感觉完全像 SpaceMonkey
【解决方案2】:

我也有同样的问题。这表明输出是相同的。区别在于输入格式(维度(元组或列表)的单个 arg 与维度 args 的序列):

# np.random.random([2,3]) vs np.random.rand(2,3)

print()
np.random.seed(1)
print('  .. np.random.random([2,3]):\n', np.random.random([2,3]))
print()
np.random.seed(1)
print('  .. np.random.rand(2,3):\n', np.random.rand(2,3))

# output

 .. np.random.random([2,3]):
 [[4.17022005e-01 7.20324493e-01 1.14374817e-04]
 [3.02332573e-01 1.46755891e-01 9.23385948e-02]]

  .. np.random.rand(2,3):
 [[4.17022005e-01 7.20324493e-01 1.14374817e-04]
 [3.02332573e-01 1.46755891e-01 9.23385948e-02]]

【讨论】:

    猜你喜欢
    • 2021-11-04
    • 1970-01-01
    • 2019-02-15
    • 2019-05-25
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    • 1970-01-01
    • 2016-03-23
    相关资源
    最近更新 更多