【Python】Numpy 中的 shuffle VS permutation

有时候我们会有随机打乱一个数组的需求,例如训练时随机打乱样本,我们可以使用 numpy.random.shuffle() 或者 numpy.random.permutation() 来完成。这两者非常相似,实现的功能是一样的,那么他们到底有什么区别?

本文代码及图片可以在 我的GitHub 找到。


参数区别

以下 numpy.random.shuffle() 简称 shufflenumpy.random.permutation() 简称 permutation

  • shuffle 的参数只能是 array_like,而 permutation 除了 array_like 还可以是 int 类型,如果是 int 类型,那就随机打乱 numpy.arange(int)
  • shuffle 返回 None,这点尤其要注意,也就是说没有返回值,而 permutation 则返回打乱后的 array。

实现区别

permutation 其实在内部实现也是调用的 shuffle,这点从 Numpy 的源码 可以看出来:

def permutation(self, object x):
    '''这里都是帮助文档,我就省略了'''
    if isinstance(x, (int, long, np.integer)):
        arr = np.arange(x)
    else:
        arr = np.array(x)
    self.shuffle(arr)
    return arr

速度区别

为了测试两者的速度区别,我分别使用了 shufflepermutation 对不同长度的 array 进行随机打乱并计时。

关键代码如下:

n = 10 ** np.arange(1, 10)
shuffle_elapsed = []
permutation_elapsed = []
for i in n:
    print(i)
    start = time.time()
    a = np.arange(i)
    np.random.shuffle(a)
    end = time.time()
    shuffle_elapsed.append((i, end - start))

    start = time.time()
    b = np.random.permutation(i)
    end = time.time()
    permutation_elapsed.append((i, end - start))

结果:

这里写图片描述
右键在新标签页打开查看大图

可以看出在达到 1 0 9 10^9 109 级别以前,两者速度几乎没有差别,但是在 达到 1 0 9 10^9 109 以后两者速度差距明显拉大,shuffle 的用时明显短于 permutation

所以在 array 很大的时候还是使用 shuffle 速度更快些,但要注意其不返回打乱后的 array,是 inplace 修改。


END

Python中的numpy库是一个用于科学计算的强大工具,而其中的random模块则专门用于生成随机数。numpy.random模块提供了多种生成随机数的方法,可以满足不同的需求。以下是一些常用的功能: 1. **生成随机数**: - `numpy.random.rand(d0, d1, ..., dn)`:生成一个指定形状的数组,数组中的元素是[0, 1)之间的随机浮点数。 - `numpy.random.randn(d0, d1, ..., dn)`:生成一个指定形状的数组,数组中的元素是标准正态分布的随机数。 2. **随机种子**: - `numpy.random.seed(seed)`:设置随机数生成的种子,以确保每次运行代码时生成的随机数相同。 3. **随机排列**: - `numpy.random.shuffle(x)`:对数组进行原地随机排列。 - `numpy.random.permutation(x)`:返回一个新的随机排列的数组。 4. **随机选择**: - `numpy.random.choice(a, size=None, replace=True, p=None)`:从一维数组中随机选择元素,可以设置选择的数量、是否放回以及每个元素被选择的概率。 5. **分布**: - `numpy.random.uniform(low=0.0, high=1.0, size=None)`:生成均匀分布的随机数。 - `numpy.random.normal(loc=0.0, scale=1.0, size=None)`:生成正态分布的随机数。 示例代码: ```python import numpy as np # 设置随机种子 np.random.seed(42) # 生成一个3x3的随机浮点数数组 random_array = np.random.rand(3, 3) print("随机浮点数数组:\n", random_array) # 生成一个3x3的标准正态分布数组 normal_array = np.random.randn(3, 3) print("标准正态分布数组:\n", normal_array) # 对数组进行随机排列 arr = np.arange(10) np.random.shuffle(arr) print("随机排列后的数组:\n", arr) # 从数组中随机选择元素 choice = np.random.choice(arr, size=5, replace=False) print("随机选择的元素:\n", choice) ```
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

secsilm

来一根火腿?

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值