关于Numpy之repeat、tile的用法总结


Posted in Python onJune 02, 2021

repeat函数的作用:①扩充数组元素 ②降低数组维度

numpy.repeat(a, repeats, axis=None):若axis=None,对于多维数组而言,可以将多维数组变化为一维数组,然后再根据repeats参数扩充数组元素;若axis=M,表示数组在轴M上扩充数组元素。

下面以3维数组为例,了解下repeat函数的使用方法:

In [1]: import numpy as np 
In [2]: arr = np.arange(12).reshape(1,4,3) 
In [3]: arr
Out[3]:
array([[[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8],
        [ 9, 10, 11]]])

①repeats为整数N,axis=None:数组arr首先被扁平化,然后将数组arr中的各个元素 依次重复N次

In [4]: arr.repeat(2)
Out[4]:
array([ 0,  0,  1,  1,  2,  2,  3,  3,  4,  4,  5,  5,  6,  6,  7,  7,  8,
        8,  9,  9, 10, 10, 11, 11])

②repeats为整数数组rp_arr,axis=None:数组arr首先被扁平化,然后再将数组arr中元素依次重复对应rp_arr数组中元素对应次数。若rp_arr为一个值的一维数组,则数组arr中各个元素重复相同次数,否则rp_arr数组长度必须和数组arr的长度相等,否则报错

a:rp_arr为单值一维数组,进行广播

In [5]: arr.repeat([2])
Out[5]:
array([ 0,  0,  1,  1,  2,  2,  3,  3,  4,  4,  5,  5,  6,  6,  7,  7,  8,
        8,  9,  9, 10, 10, 11, 11])

b:rp_arr长度小于数组arr长度,无法进行广播,报错

In [6]: arr.repeat([2,3,4])
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-6-d3b52907284c> in <module>()
----> 1 arr.repeat([2,3,4])

ValueError: operands could not be broadcast together with shape (12,) (3,)

c:rp_arr长度和数组arr长度相等

In [7]: arr.repeat(np.arange(12))
Out[7]:
array([ 1,  2,  2,  3,  3,  3,  4,  4,  4,  4,  5,  5,  5,  5,  5,  6,  6,
        6,  6,  6,  6,  7,  7,  7,  7,  7,  7,  7,  8,  8,  8,  8,  8,  8,
        8,  8,  9,  9,  9,  9,  9,  9,  9,  9,  9, 10, 10, 10, 10, 10, 10,
       10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11])

d:rp_arr长度大于数组arr长度,也无法广播,报错

In [8]: arr.repeat(np.arange(13))
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-8-ec8454224d1b> in <module>()
----> 1 arr.repeat(np.arange(13))

ValueError: operands could not be broadcast together with shape (12,) (13,)

结论:两个数组满足广播的条件是两个数组的后缘维度(即从末尾开始算起的维度)的轴长度相等或其中一方的长度为1

③repeats为整数N,axis=M:数组arr的轴M上的每个元素重复N次,M=-1代表最后一条轴

In [9]: arr.repeat(2,axis=0)
Out[9]:
array([[[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8],
        [ 9, 10, 11]],
 
       [[ 0,  1,  2],
        [ 3,  4,  5],
        [ 6,  7,  8],
        [ 9, 10, 11]]])
In [12]: arr.repeat(2,axis=-1)#arr.repeat(2,axis=-1)等同于arr.repeat(2,axis=2)
Out[12]:
array([[[ 0,  0,  1,  1,  2,  2],
        [ 3,  3,  4,  4,  5,  5],
        [ 6,  6,  7,  7,  8,  8],
        [ 9,  9, 10, 10, 11, 11]]])

④repeats为整数数组rp_arr,axis=M:把数组arr1轴M上的元素依次重复对应rp_arr数组中元素对应次数。若rp_arr为一个值的一维数组,则数组arr1轴M上的各个元素重复相同次数,否则rp_arr数组长度必须和数组arr1轴M的长度相等,否则报错

a:rp_arr长度和数组arr1轴M上长度相等

在轴0上扩充数组元素

In [13]: arr1 = np.arange(24).reshape(4,2,3) 
In [14]: arr1
Out[14]:
array([[[ 0,  1,  2],
        [ 3,  4,  5]],
 
       [[ 6,  7,  8],
        [ 9, 10, 11]],
 
       [[12, 13, 14],
        [15, 16, 17]],
 
       [[18, 19, 20],
        [21, 22, 23]]])
 
In [15]: arr1.repeat((1,2,3,4),axis=0)
Out[15]:
array([[[ 0,  1,  2],
        [ 3,  4,  5]],
 
       [[ 6,  7,  8],
        [ 9, 10, 11]],
 
       [[ 6,  7,  8],
        [ 9, 10, 11]],
 
       [[12, 13, 14],
        [15, 16, 17]],
 
       [[12, 13, 14],
        [15, 16, 17]],
 
       [[12, 13, 14],
        [15, 16, 17]],
 
       [[18, 19, 20],
        [21, 22, 23]],
 
       [[18, 19, 20],
        [21, 22, 23]],
 
       [[18, 19, 20],
        [21, 22, 23]],
 
       [[18, 19, 20],
        [21, 22, 23]]])

在轴1上扩充数组元素

In [19]: arr1.repeat([1,2],axis=1)
Out[19]:
array([[[ 0,  1,  2],
        [ 3,  4,  5],
        [ 3,  4,  5]],
 
       [[ 6,  7,  8],
        [ 9, 10, 11],
        [ 9, 10, 11]],
 
       [[12, 13, 14],
        [15, 16, 17],
        [15, 16, 17]],
 
       [[18, 19, 20],
        [21, 22, 23],
        [21, 22, 23]]])

b:rp_arr为单值数组时,进行广播

In [20]: arr1.repeat([2],axis=0)
Out[20]:
array([[[ 0,  1,  2],
        [ 3,  4,  5]],
 
       [[ 0,  1,  2],
        [ 3,  4,  5]],
 
       [[ 6,  7,  8],
        [ 9, 10, 11]],
 
       [[ 6,  7,  8],
        [ 9, 10, 11]],
 
       [[12, 13, 14],
        [15, 16, 17]],
 
       [[12, 13, 14],
        [15, 16, 17]],
 
       [[18, 19, 20],
        [21, 22, 23]],
 
       [[18, 19, 20],
        [21, 22, 23]]])

c:rp_arr和数组arr1某轴不满足广播条件,则报错

In [21]: arr1.repeat((1,2,3),axis=0)
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-21-8ae4dc97e410> in <module>()
----> 1 arr1.repeat((1,2,3),axis=0)

ValueError: operands could not be broadcast together with shape (4,) (3,)

tile函数两个作用:①扩充数组元素 ②提升数组维度

numpy.tile(A, reps):根据reps中元素扩充数组A中对应轴上的元素

①reps为整数N:可以把整数N理解成含一个元素N的序列reps,若数组.ndim大于reps序列的长度,则需在reps序列的索引为0的位置开始添加元素1,直到reps的长度和数组的维度数相等,然后数组各轴上的元素依次重复reps序列中元素对应的次数

对于一维数组而言:是整体数组重复N次,从数组的最后一位置开始重复,注意与repeat函数的区别

In [26]: arr3 = np.arange(4) 
In [27]: arr3
Out[27]: array([0, 1, 2, 3]) 
In [28]: np.tile(arr3,2)
Out[28]: array([0, 1, 2, 3, 0, 1, 2, 3])

对多维数组而言:arr2.ndim=3,,reps=[2,],可以看出数组的长度大于序列reps的长度,因此需要向reps中添加元素,变成reps=[1,1,2],然后arr2数组再根据reps中的元素重复其对应轴上的元素,reps=[1,1,2]代表数组arr2在轴0上各个元素重复1次,在轴1上的各个元素重复1次,在轴1上的各个元素重复2次

In [29]: arr2 = np.arange(24).reshape(4,2,3) 
In [30]: arr2
Out[30]:
array([[[ 0,  1,  2],
        [ 3,  4,  5]],
 
       [[ 6,  7,  8],
        [ 9, 10, 11]],
 
       [[12, 13, 14],
        [15, 16, 17]],
 
       [[18, 19, 20],
        [21, 22, 23]]])
 
In [31]: np.tile(arr2,2)
Out[31]:
array([[[ 0,  1,  2,  0,  1,  2],
        [ 3,  4,  5,  3,  4,  5]],
 
       [[ 6,  7,  8,  6,  7,  8],
        [ 9, 10, 11,  9, 10, 11]],
 
       [[12, 13, 14, 12, 13, 14],
        [15, 16, 17, 15, 16, 17]],
 
       [[18, 19, 20, 18, 19, 20],
        [21, 22, 23, 21, 22, 23]]])

②reps为整数序列rp_arr:若数组.ndim大于rp_arr长度,方法同①相同,若数组ndim小于rp_arr长度,则需在数组的首缘维添加新轴,直到数组的维度数和rp_arr长度相等,然后数组各轴上的元素依次重复reps序列中元素对应的次数

a:数组维度大于rp_arr长度:需rp_arr提升为(1,2,3)

In [33]: arr2 = np.arange(24).reshape(4,2,3) 
In [34]: arr2
Out[34]:
array([[[ 0,  1,  2],
        [ 3,  4,  5]],
 
       [[ 6,  7,  8],
        [ 9, 10, 11]],
 
       [[12, 13, 14],
        [15, 16, 17]],
 
       [[18, 19, 20],
        [21, 22, 23]]])
 
In [35]: np.tile(arr2,(2,3))
Out[35]:
array([[[ 0,  1,  2,  0,  1,  2,  0,  1,  2],
        [ 3,  4,  5,  3,  4,  5,  3,  4,  5],
        [ 0,  1,  2,  0,  1,  2,  0,  1,  2],
        [ 3,  4,  5,  3,  4,  5,  3,  4,  5]],
 
       [[ 6,  7,  8,  6,  7,  8,  6,  7,  8],
        [ 9, 10, 11,  9, 10, 11,  9, 10, 11],
        [ 6,  7,  8,  6,  7,  8,  6,  7,  8],
        [ 9, 10, 11,  9, 10, 11,  9, 10, 11]],
 
       [[12, 13, 14, 12, 13, 14, 12, 13, 14],
        [15, 16, 17, 15, 16, 17, 15, 16, 17],
        [12, 13, 14, 12, 13, 14, 12, 13, 14],
        [15, 16, 17, 15, 16, 17, 15, 16, 17]],
 
       [[18, 19, 20, 18, 19, 20, 18, 19, 20],
        [21, 22, 23, 21, 22, 23, 21, 22, 23],
        [18, 19, 20, 18, 19, 20, 18, 19, 20],
        [21, 22, 23, 21, 22, 23, 21, 22, 23]]])

b:数组的维度小于rp_arr的长度:需在数组的首缘维度新增加一条轴,使其shape变为(1,4,2,3)

In [36]: np.tile(arr2,(2,1,1,3))
Out[36]:
array([[[[ 0,  1,  2,  0,  1,  2,  0,  1,  2],
         [ 3,  4,  5,  3,  4,  5,  3,  4,  5]],
 
        [[ 6,  7,  8,  6,  7,  8,  6,  7,  8],
         [ 9, 10, 11,  9, 10, 11,  9, 10, 11]],
 
        [[12, 13, 14, 12, 13, 14, 12, 13, 14],
         [15, 16, 17, 15, 16, 17, 15, 16, 17]],
 
        [[18, 19, 20, 18, 19, 20, 18, 19, 20],
         [21, 22, 23, 21, 22, 23, 21, 22, 23]]],
 
 
       [[[ 0,  1,  2,  0,  1,  2,  0,  1,  2],
         [ 3,  4,  5,  3,  4,  5,  3,  4,  5]],
 
        [[ 6,  7,  8,  6,  7,  8,  6,  7,  8],
         [ 9, 10, 11,  9, 10, 11,  9, 10, 11]],
 
        [[12, 13, 14, 12, 13, 14, 12, 13, 14],
         [15, 16, 17, 15, 16, 17, 15, 16, 17]],
 
        [[18, 19, 20, 18, 19, 20, 18, 19, 20],
         [21, 22, 23, 21, 22, 23, 21, 22, 23]]]])

numpy的repeat和tile 用来复制数组

repeat和tile都可以用来复制数组的,但是有一些区别

关键区别在于repeat是对于元素的复制,tile是以整个数组为单位的 ,repeat复制时元素依次复制,注意不要用错,区别类似于[1,1,2,2]和[1,2,1,2]

repeat

用法

np.repeat(a, repeats, axis=None)

重复复制数组a的元素,元素的定义与axis有关,axis不指定时,数组会被展开进行复制,每个元素就是一个值,指定axis时,就是aixis指定维度上的一个元素

a = np.array([[1,2], 
                      [3,4]])

不指定axis,默认None,这时候数组会被展开成1维,再进行复制

np.repeat(a, 2)  # 所有元素依次复制相同的次数

关于Numpy之repeat、tile的用法总结

参数是列表

np.repeat(a, [1, 2, 1, 2])  # 如果第二个参数是列表,列表长度必须和a的复制可选元素数目相等,这里都是4

关于Numpy之repeat、tile的用法总结

指定axis

指定时,就是指定了复制元素沿的维度,这时候就不会把数组展平,会维持原来的维度数

np.repeat(a, 2,  axi=0)  # 所有沿着0维的元素依次复制相同的次数

关于Numpy之repeat、tile的用法总结

np.repeat(a, [1, 2], axis=1)  # 第二个参数是列表,列表长度必须和a的复制可选元素数目相等,这里是2

结果如下,复制元素从第1维度算,可以看到第一列被复制了一次,第二列被复制了两次

关于Numpy之repeat、tile的用法总结

tile

用法

np.tile(a, repeats)

复制数组,repeats可以是整数或者元组、数组

repeats是整数

示例如下,它会将数组复制两份,并且在最后一维将两个元素叠加在一起,数组的维数不变,最后一维根据复制次数加倍

关于Numpy之repeat、tile的用法总结

repeats是列表或元组

如果列表长度是1,和整数时相同。

列表长度不为1时,列表从后向前看,最后一项是2,所以复制两个数组,在最后一维进行叠加,倒数第二项是3,将前步的结果进行复制,并在倒数第二维,结果如下

关于Numpy之repeat、tile的用法总结

当列表的长度超过数组的维数时,和前面类似,从后向前复制,复制结果会增加维度与列表的维数匹配,结果如下,在上面的基础上,增加了一维

关于Numpy之repeat、tile的用法总结

复制结果的shape

关于Numpy之repeat、tile的用法总结

但是对于 简单的单个数组重复,个人更喜欢使用stack和concatenate将同一个数组堆叠起来

以上为个人经验,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现图片变亮或者变暗的方法
Jun 01 Python
Python脚本实时处理log文件的方法
Nov 21 Python
安装Python和pygame及相应的环境变量配置(图文教程)
Jun 04 Python
Python微信公众号开发平台
Jan 25 Python
Python学习笔记之图片人脸检测识别实例教程
Mar 06 Python
python 的 scapy库,实现网卡收发包的例子
Jul 23 Python
python绘制彩虹图
Dec 16 Python
pandas factorize实现将字符串特征转化为数字特征
Dec 19 Python
Python3查找列表中重复元素的个数的3种方法详解
Feb 13 Python
keras的ImageDataGenerator和flow()的用法说明
Jul 03 Python
python基本算法之实现归并排序(Merge sort)
Sep 01 Python
解决Pymongo insert时会自动添加_id的问题
Dec 05 Python
Matlab如何实现矩阵复制扩充
Jun 02 #Python
给numpy.array增加维度的超简单方法
Jun 02 #Python
pytorch model.cuda()花费时间很长的解决
如何理解及使用Python闭包
python pygame入门教程
python plt.plot bar 如何设置绘图尺寸大小
python用tkinter开发的扫雷游戏
You might like
用php获取远程图片并把它保存到本地的代码
2008/04/07 PHP
解析mysql left( right ) join使用on与where筛选的差异
2013/06/18 PHP
php_screw 1.5:php加密: 安装与使用详解
2013/06/20 PHP
php实现的日历程序
2015/06/18 PHP
小程序微信支付功能配置方法示例详解【基于thinkPHP】
2019/05/05 PHP
JavaScript Serializer序列化时间处理示例
2014/07/31 Javascript
基于jQuey实现鼠标滑过变色(整行变色)
2015/12/07 Javascript
JavaScript学习笔记之数组的增、删、改、查
2016/03/23 Javascript
jQuery+CSS实现一个侧滑导航菜单代码
2016/05/09 Javascript
微信小程序开发一键登录 获取session_key和openid实例
2016/11/23 Javascript
清除浏览器缓存的几种方法总结(必看)
2016/12/09 Javascript
JS判断键盘是否按的回车键并触发指定按钮点击操作的方法
2017/02/13 Javascript
简述Angular 5 快速入门
2017/11/04 Javascript
JavaScript 高性能数组去重的方法
2018/09/20 Javascript
js实现3D照片墙效果
2019/10/28 Javascript
关于ES6尾调用优化的使用
2020/09/11 Javascript
python基础教程之基本数据类型和变量声明介绍
2014/08/29 Python
Python求两个文本文件以行为单位的交集、并集与差集的方法
2015/06/17 Python
python解决网站的反爬虫策略总结
2016/10/26 Python
对Python中DataFrame按照行遍历的方法
2018/04/08 Python
Python3数字求和的实例
2019/02/19 Python
python与字符编码问题
2019/05/24 Python
python3实现二叉树的遍历与递归算法解析(小结)
2019/07/03 Python
Python的in,is和id函数代码实例
2020/04/18 Python
详解CSS3中强大的filter(滤镜)属性
2017/06/29 HTML / CSS
HTML5新特性之用SVG绘制微信logo
2016/02/03 HTML / CSS
一些Unix笔试题和面试题
2013/01/22 面试题
英文翻译的自我评价语句
2013/10/04 职场文书
致跳远、跳高运动员广播稿
2014/01/09 职场文书
开业主持词
2014/03/21 职场文书
内勤岗位职责
2015/02/10 职场文书
走进毛泽东观后感
2015/06/04 职场文书
800字作文之大雪
2019/12/04 职场文书
python实现socket简单通信的示例代码
2021/04/13 Python
spring cloud gateway中如何读取请求参数
2021/07/15 Java/Android
NoSQL优缺点与MongoDB数据库简介
2022/06/05 MongoDB