均匀随机数

2 投票
2 回答
998 浏览
提问于 2025-04-17 17:56

我正在试着理解这段代码的作用。我在学习一些关于numpy和绘图的例子,但我搞不清楚uv是什么。我知道u是一个包含两个数组的数组,每个数组的大小都是10000。那么v=u.max(axis=0)这行代码是干什么的呢?这里的max函数是标准Python库的一部分吗?当我绘制直方图时,我得到的概率密度函数是2x,而不是正常的均匀分布。

import numpy as np
import numpy.random as rand
import matplotlib.pyplot as plt

np.random.seed(123)
u=rand.uniform(0,1,[2,10000])
v=u.max(axis=0)
plt.figure()
plt.hist(v,100,normed=1,color='blue')
plt.ylim([0,2])
plt.show()

2 个回答

3

前面三行代码是加载不同的模块(也就是在后面的代码中需要用到的库)。你加载了 numpy,这是一个处理数字的库;然后是 numpy.random,这个库可以生成很多随机数;最后是 matplotlib,它可以用来绘制图形。

接下来的内容解释如下:

np.random.seed(123)

计算机其实并不是随机生成一个数字,而是从一个很长的数字列表中挑选一个数字(如果想了解更详细的解释,可以查看这个链接:http://en.wikipedia.org/wiki/Random_number_generation)。简单来说,如果你想用相同的随机数重复之前的工作,计算机需要知道从这个数字列表的哪个位置开始挑选数字。这行代码就是为了这个目的。如果其他人运行同样的代码,他们也会得到相同的“随机”数字。

u=rand.uniform(0,1,[2,10000])

这行代码生成了两组各10000个随机数,这些数字的范围在0到1之间。这是均匀分布,也就是说在0到1之间的每个点被选中的概率是一样的。(如果想了解更多信息,可以查看这个链接:http://en.wikipedia.org/wiki/Uniform_distribution_(continuous))。你实际上是在创建一个包含两个数组的数组。你可以通过执行 len(u)len(u[0]) 来检查这一点。

v=u.max(axis=0)

在iPython中,u.max? 命令会引导你查看文档。这个命令的作用是选择最大值,而轴(axis)则决定了如何选择这个最大值。你可以尝试以下操作:

a = np.arange(4).reshape((2,2))
np.amax(a, axis=0) # gives array([2, 3])
np.amax(a, axis=1) # gives array([1, 3])

接下来的代码是用来设置直方图的。直方图总共有100个箱子,柱子的颜色是蓝色。直方图的y轴最大高度是2,并且通过归一化(normed)确保每个箱子至少有一个样本。

我不太清楚这段代码的真正目的或应用是什么,但大致上就是在做这些事情。

3

u.max(),或者说 np.max(u),会给你数组中的最大值,也就是一个单独的数值。这是Numpy库里的函数,不是标准库的一部分。你通常想要在某个特定的方向上找到最大值,这就是这里要做的事情。

U的形状是 (2,10000),使用 u.max(axis=0) 会沿着第 0 轴找到最大值,返回一个形状为 (10000,) 的数组。如果你用 u.max(axis=1),你会得到一个形状为 (2,) 的数组。

简单的例子:

>>> a = np.array([[1,2],[3,4]])
>>> a
array([[1, 2],
       [3, 4]])
>>> a.max(axis=0)
array([3, 4])
>>> a.max(axis=1)
array([2, 4])
>>> a.max()
4

撰写回答