Numpy 生成指定比例的 0 和 1 随机数组
阅读更多:Numpy 教程
介绍
NumPy 是 Python 中用于科学计算的基础库之一。本篇文章将讨论在 NumPy 中如何生成指定比例的 0 和 1 的随机数组。
numpy.random.choice
NumPy 的 random
模块为我们提供了许多生成随机数的函数。其中,numpy.random.choice
函数是专门用于生成从给定的一组元素中进行随机采样的函数。
函数签名:
numpy.random.choice(a, size=None, replace=True, p=None)
参数解释:
– a
:要进行随机采样的数组或整数
– size
:采样结果的形状,可以是整数或元组。缺省时返回一个随机数
– replace
:是否需要放回取样,默认为 True
– p
:样本中各元素出现的概率。缺省时各元素的概率相等
生成一个长度为 10 的随机数组,其中每个元素有一半的概率等于 1,一半的概率等于 0:
>>> import numpy as np
>>> np.random.choice([0, 1], size=10)
array([1, 1, 0, 0, 1, 1, 0, 1, 0, 1])
生成一个长度为 5×5 的二维数组,其中每个元素有三分之一的概率等于 1,三分之二的概率等于 0:
>>> np.random.choice([0, 1], size=(5, 5), p=[2/3, 1/3])
array([[0, 0, 1, 0, 0],
[1, 0, 0, 0, 0],
[0, 0, 0, 0, 0],
[0, 0, 0, 1, 0],
[0, 0, 0, 0, 0]])
由此可见,numpy.random.choice
函数提供了在指定概率下生成不同大小数组的能力。但是,我们需要生成指定比例的 0 和 1 随机数组,上述方法无法直接实现。接下来,我们将介绍如何使用 numpy.random.choice
函数来生成指定比例的 0 和 1 随机数组。
实现指定比例生成 0 和 1 随机数组
方法1:使用重复随机采样并判断比例
我们可以通过进行多次重复采样的方式,来确定生成的数组中 1
出现的比例是否满足要求。这一过程的具体实现如下:
import numpy as np
def random_array(p, size):
'''
p: 生成数组中 1 的比例
size: 指定生成数组的形状,(m, n) or m
return: 生成指定比例的随机数组
'''
if type(size) == int:
size = (size, )
array_size = np.prod(size)
num_ones = int(p * array_size)
array = np.zeros(array_size)
array[:num_ones] = 1
np.random.shuffle(array)
return array.reshape(size)
print(random_array(0.5, 10))
print(random_array(0.5, (5, 2)))
生成一个长度为 10 的随机数组,其中每个元素有一半的概率等于 1,一半的概率等于 0:
>>> random_array(0.5, 10)
array([1., 1., 0., 0., 0., 1., 1., 1., 1., 0.])
生成一个 5×2 的二维数组,其中每个元素有三分之一的概率等于 1,三分之二的概率等于 0:
>>> random_array(1/3, (5, 2))
array([[0., 1.],
[0., 1.],
[0., 0.],
[0., 1.],
[0., 0.]])
虽然这个方法实现相对简单,但是需要进行多次重复采样,当所需采样次数很大时,就显得不太实用。
方法2:使用二项式分布实现
实际上,我们可以使用二项式分布来实现生成随机数组。假设我们需要生成一个长度为 n
,比例为 p
的随机数组,则我们可以使用 numpy.random.binomial
函数来实现。这里的二项式分布表示了在 n
次伯努利试验中,出现 k
次成功的概率。
import numpy as np
def random_array(p, size):
'''
p: 生成数组中 1 的比例
size: 指定生成数组的形状,(m, n) or m
return: 生成指定比例的随机数组
'''
if type(size) == int:
size = (size, )
array_size = int(np.prod(size))
num_ones = np.random.binomial(n=array_size, p=p)
array = np.zeros(array_size)
array[:num_ones] = 1
np.random.shuffle(array)
return array.reshape(size)
print(random_array(0.5, 10))
print(random_array(0.5, (5, 2)))
运行结果为:
>>> random_array(0.5, 10)
array([1., 0., 0., 0., 0., 1., 0., 0., 0., 1.])
>>> random_array(1/3, (5, 2))
array([[0., 0.],
[0., 0.],
[1., 1.],
[0., 0.],
[0., 0.]])
当指定统计次数 array_size
足够大时,numpy.random.binomial
可以准确地生成特定比例的随机数组。
总结
本篇文章介绍了使用 NumPy 中的 numpy.random.choice
和 numpy.random.binomial
函数来生成指定比例的 0 和 1 随机数组。具体实现方法有多种,但可以通过使用二项式分布函数来得到精确结果,减少重复采样的开销。