【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))

结果:

右键在新标签页打开查看大图

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

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

END

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏木子昭的博客

创意终端影集左侧效果图:

左侧效果图: ? ? ? ? ? 实现思路: 通过python的PIL库,将彩色转黑白(256种灰度),创建字符集,建立字符集与灰度的映射 ? 动图 把照片裁成...

3457
来自专栏流柯技术学院

jmeter参数化随机取值实现

jmeter能用来做参数化的组件有几个,但是都没有随机取值的功能,遇到随机取值的需求怎么办呢?

1092
来自专栏CNN

Tensorflow将模型导出为一个文件及接口设置

在上一篇文章中《Tensorflow加载预训练模型和保存模型》,我们学习到如何使用预训练的模型。但注意到,在上一篇文章中使用预训练模型,必须至少的要4个文件:

1482
来自专栏fangyangcoder

tensorflow笔记(一)之基础知识

http://www.cnblogs.com/fydeblog/p/7399701.html

952
来自专栏PaddlePaddle

【进阶篇】C-API 使用流程

编写|PaddlePaddle 排版|wangp 这篇推文介绍 PaddlePaddle C-API 整体使用流程 1 使用流程 使用 C-API 的工作流...

3083
来自专栏和蔼的张星的图像处理专栏

总结?

其实算不得总结,lintcode这个在专题不会再更新了,准备秋招的时候大概看过一遍这个,有些还是很有用的,然后剑指offer差不多刷了一遍,过些天闲了我把剑指o...

874
来自专栏CDA数据分析师

excel隔行选取新方法,99.99%的人没用过!

文 | 赵志东 有一个excel表格,需要隔N行选取。可能是隔一行,也可能是隔2行、3行。 ? 常见的有两种方法: 一、按ctrl键不松用鼠标逐行选取。如果需要...

1806
来自专栏CNN

从Tensorflow模型文件中解析并显示网络结构图(CKPT模型篇)

本文介绍如何从CKPT模型文件中提取网络结构图并实现可视化。

5873
来自专栏蘑菇先生的技术笔记

探索c#之一致性Hash详解

2445
来自专栏MixLab科技+设计实验室

自己动手做一个识别手写数字的web应用01

最近在深入地学习keras,发现网上各种教程都是教你怎么训练模型的,很少有问题提到如何把训练好的模型部署为后端服务,为web及app提供服务。 于是,我决定把学...

3948

扫码关注云+社区