Numpy 生成指定比例的 0 和 1 随机数组

Numpy 生成指定比例的 0 和 1 随机数组

阅读更多:Numpy 教程

介绍

NumPyPython 中用于科学计算的基础库之一。本篇文章将讨论在 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.choicenumpy.random.binomial 函数来生成指定比例的 0 和 1 随机数组。具体实现方法有多种,但可以通过使用二项式分布函数来得到精确结果,减少重复采样的开销。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程