关于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发送各类邮件的主要方法
Dec 22 Python
python爬取各类文档方法归类汇总
Mar 22 Python
python 列表,数组和矩阵sum的用法及区别介绍
Jun 28 Python
python设置值及NaN值处理方法
Jul 03 Python
启动Atom并运行python文件的步骤
Nov 09 Python
用Q-learning算法实现自动走迷宫机器人的方法示例
Jun 03 Python
Python实现TCP通信的示例代码
Sep 09 Python
pytorch 计算Parameter和FLOP的操作
Mar 04 Python
PyQt5爬取12306车票信息程序的实现
May 14 Python
golang特有程序结构入门教程
Jun 02 Python
Python max函数中key的用法及原理解析
Jun 26 Python
python中subplot大小的设置步骤
Jun 28 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
Protoss热键控制
2020/03/14 星际争霸
PHP实现模仿socket请求返回页面的方法
2014/11/04 PHP
php实现基于微信公众平台开发SDK(demo)扩展的方法
2014/12/22 PHP
php短信接口代码
2016/05/13 PHP
总结PHP中初始化空数组的最佳方法
2019/02/13 PHP
PHPUnit + Laravel单元测试常用技能
2019/11/06 PHP
通过PHP实现用户注册后邮箱验证激活
2020/11/10 PHP
重定向实现代码
2006/11/20 Javascript
Ajax一统天下之Dojo整合篇
2007/03/24 Javascript
js 优化次数过多的循环 考虑到性能问题
2011/03/05 Javascript
window.location.href中url中数据量太大时的解决方法
2013/12/23 Javascript
JS实现的数组全排列输出算法
2015/03/19 Javascript
js实现网页收藏功能
2015/12/17 Javascript
基于jPlayer三分屏的制作方法
2016/12/21 Javascript
Javascript仿京东放大镜的效果
2017/03/01 Javascript
canvas实现爱心和彩虹雨效果
2017/03/09 Javascript
jQuery使用zTree插件实现可拖拽的树示例
2017/09/23 jQuery
vue实现登录后页面跳转到之前页面
2018/01/07 Javascript
LayerClose弹窗关闭刷新方法
2018/08/17 Javascript
js实现同一个页面,多个enter事件绑定的示例
2018/10/10 Javascript
vue组件tabbar使用方法详解
2018/11/06 Javascript
vue 使用lodash实现对象数组深拷贝操作
2020/09/10 Javascript
在react-antd中弹出层form内容传递给父组件的操作
2020/10/24 Javascript
Python面向对象程序设计之类的定义与继承简单示例
2019/03/18 Python
Staples英国官方网站:办公用品一站式采购
2017/10/06 全球购物
be2台湾单身男女交友:全球网路婚姻介绍的领导品牌
2019/10/11 全球购物
澳大利亚Rockwear官网:女子瑜伽、健身和运动服
2021/01/26 全球购物
外语专业毕业生自我评价分享
2013/10/05 职场文书
销售顾问的岗位职责
2013/11/13 职场文书
思想专业自荐信范文
2013/12/25 职场文书
安全生产演讲稿
2014/05/09 职场文书
异地年检委托书范本
2014/09/24 职场文书
舞出我人生观后感
2015/06/16 职场文书
MySQL空间数据存储及函数
2021/09/25 MySQL
MySQL表类型 存储引擎 的选择
2021/11/11 MySQL
Java 深入探究讲解简单工厂模式
2022/04/07 Java/Android