np.random.rand vs np.random.random
我发现Python(及其生态系统)充满了奇怪的约定和不一致之处,这是另一个示例:
np.random.rand
Create an array of the given shape and populate it with random samples from a uniform distribution over [0, 1).
np.random.random
Return random floats in the half-open interval [0.0, 1.0). Results are from the"continuous uniform" distribution over the stated interval.
??? 到底有什么区别?
-
"连续均匀"分布与均匀分布之间存在差异。这可以帮助您澄清以下问题:docs.scipy.org/doc/numpy-1.13.0/reference/generated/
-
见stackoverflow.com/a/24542083/6328256
-
参见en.wikipedia.org/wiki/Uniform_distribution_(连续)和en.wikipedia.org/wiki/Discrete_uniform_distribution
-
这可能是相同的情况:stackoverflow.com/a/46634281/2285236
-
@ayhan是正确的!
-
@ shash678与Im询问的内容无关。这两个函数用于生成标准规范或特定规范(选择均值和方差/ sd)。
-
@Caleb_McCreary我从该页面逐字引用..不,除非他们说"离散"和"连续",否则没有区别,离散在0和1之间没有意义。检查答案,两个函数实际上是相同的,似乎只是matlab用户的惯例,使其他人感到困惑/烦恼
-
@Spacemonkey我认为您可能忽略了它。我真的很想相信它们会用于离散且连续的均匀分布,因为两个相同但名称不同的函数是asinine,但是,嘿,我的脸蛋。很高兴您得到了答案!
-
@Caleb_McCreary我原谅了你的罪过
首先请注意,numpy.random.random实际上是numpy.random.random_sample的别名。我将在下面使用后者。 (有关更多别名,请参见此问题和答案。)
这两个函数均根据[0,1)上的均匀分布生成样本。唯一的区别在于参数的处理方式。使用numpy.random.rand时,输出数组每个维度的长度是一个单独的参数。对于numpy.random.random_sample,shape参数是单个元组。
例如,要创建形状为(3,5)的样本数组,您可以编写
1
| sample = np.random.rand(3, 5) |
要么
1
| sample = np.random.random_sample((3, 5)) |
(真的,就是这样。)
更新资料
从1.17版开始,NumPy具有新的随机API。从[0,1)上的均匀分布生成样本的推荐方法是:
1 2 3 4
| >>> rng = np.random.default_rng() # Create a default Generator.
>>> rng.random(size=12) # 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()方法,允许您指定分布的下限和上限。例如。
1 2 3
| >>> 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命名空间中的旧功能将继续起作用,但是它们被认为是"冻结的",没有正在进行的开发。如果您正在编写新代码,而不必支持1.17之前的numpy版本,则建议您使用新的随机API。
-
对,所以实际上没有区别。 我想知道为什么我们有两个具有不同名称的函数来执行相同的操作。恕我直言,他们应该清理掉它。
-
有历史原因,可能与使Matlab程序员更容易过渡到Python + Numpy有关(参见Matlabs rand)。 清理它可能会带来超出其价值的麻烦,因为可能已有许多使用不同版本功能的现有代码。
-
似乎Python社区对一致性的重视是"快速hacks对我来说很容易"。 最好的例子是matplotlibs约定,在创建子图时使用" 112"之类的数字表示(1,1,2)。无论如何,谢谢您的回答。
-
实际上,@ WarrenWeckesser大概不清除它是正确的。 就是说,当我想记住np.zeros((tuple dimensions arg))与np.random.randn(dim1, dim2, dim3)的参数参数之间的差异时,我感觉完全像SpaceMonkey