侯体宗的博客
  • 首页
  • Hyperf版
  • beego仿版
  • 人生(杂谈)
  • 技术
  • 关于我
  • 更多分类
    • 文件下载
    • 文字修仙
    • 中国象棋ai
    • 群聊
    • 九宫格抽奖
    • 拼图
    • 消消乐
    • 相册

深入理解NumPy简明教程---数组3(组合)

Python  /  管理员 发布于 5年前   216

前两篇文章对NumPy数组做了基本的介绍,本篇文章对NumPy数组进行较深入的探讨。首先介绍自定义类型的数组,接着数组的组合,最后介绍数组复制方面的问题。

自定义结构数组

通过NumPy也可以定义像C语言那样的结构类型。在NumPy中定义结构的方法如下:

定义结构类型名称;定义字段名称,标明字段数据类型。

student= dtype({'names':['name', 'age', 'weight'], 'formats':['S32', 'i','f']}, align = True) 

这里student是自定义结构类型的名称,使用dtype函数创建,在第一个参数中,'names'和'formats'不能改变,names中列出的是结构中字段名称,formats中列出的是对应字段的数据类型。S32表示32字节长度的字符串,i表示32位的整数,f表示32位长度的浮点数。最后一个参数为True时,表示要求进行内存对齐。

字段中使用NumPy的字符编码来表示数据类型。更详细的数据类型见下表。

数据类型 字符编码
整数 i
无符号整数 u
单精度浮点数 f
双精度浮点数 d
布尔值 b
复数 D
字符串 S
Unicode U
Void V

在定义好结构类型之后,就可以定义以该类型为元素的数组了:

a= array([(“Zhang”, 32, 65.5), (“Wang”, 24, 55.2)], dtype =student) 

除了在每个元素中依次列出对应字段的数据外,还需要在array函数中最后一个参数指定其所对应的数据类型。

注:例子来源于张若愚的Python科学计算艺术的29页。更多关于dtype的内容请参考《NumPy for Beginner》一书的第二章。

组合函数

这里介绍以不同的方式组合函数。首先创建两个数组:

>>> a = arange(9).reshape(3,3) >>> a array([[0, 1, 2],    [3, 4, 5],    [6, 7, 8]]) >>> b = 2 * a >>> b array([[ 0, 2, 4],   [ 6, 8, 10],   [12, 14, 16]]) 

水平组合

>>> hstack((a, b)) array([[ 0, 1, 2, 0, 2, 4],   [ 3, 4, 5, 6, 8, 10],   [ 6, 7, 8, 12, 14, 16]]) 

也可通过concatenate函数并指定相应的轴来获得这一效果:

>>> concatenate((a, b), axis=1) array([[ 0, 1, 2, 0, 2, 4],   [ 3, 4, 5, 6, 8, 10],   [ 6, 7, 8, 12, 14, 16]]) 

垂直组合

>>> vstack((a, b)) array([[ 0, 1, 2],   [ 3, 4, 5],   [ 6, 7, 8],   [ 0, 2, 4],   [ 6, 8, 10],   [12, 14, 16]]) 

同样,可通过concatenate函数,并指定相应的轴来获得这一效果。

>>> concatenate((a, b), axis=0) array([[ 0, 1, 2],   [ 3, 4, 5],   [ 6, 7, 8],   [ 0, 2, 4],   [ 6, 8, 10],   [12, 14, 16]]) 

深度组合

另外,还有深度方面的组合函数dstack。顾名思义,就是在数组的第三个轴(即深度)上组合。如下:

>>> dstack((a, b)) array([[[ 0, 0],   [ 1, 2],   [ 2, 4]],    [[ 3, 6],   [ 4, 8],   [ 5, 10]],    [[ 6, 12],   [ 7, 14],   [ 8, 16]]]) 

仔细观察,发现对应的元素都组合成一个新的列表,该列表作为新的数组的元素。

行组合

行组合可将多个一维数组作为新数组的每一行进行组合:

>>> one = arange(2) >>> one array([0, 1]) >>> two = one + 2 >>> two array([2, 3]) >>> row_stack((one, two)) array([[0, 1],   [2, 3]]) 

对于2维数组,其作用就像垂直组合一样。

列组合

列组合的效果应该很清楚了。如下:

>>> column_stack((oned, twiceoned)) array([[0, 2],   [1, 3]]) 

对于2维数组,其作用就像水平组合一样。

分割数组

在NumPy中,分割数组的函数有hsplit、vsplit、dsplit和split。可将数组分割成相同大小的子数组,或指定原数组分割的位置。

水平分割

>>> a = arange(9).reshape(3,3) >>> a array([[0, 1, 2],   [3, 4, 5],   [6, 7, 8]]) >>> hsplit(a, 3) [array([[0],   [3],   [6]]),  array([[1],   [4],   [7]]),  array([[2],   [5],   [8]])] 

也调用split函数并指定轴为1来获得这样的效果:

split(a, 3, axis=1) 

垂直分割

垂直分割是沿着垂直的轴切分数组:

>>> vsplit(a, 3) >>> [array([[0, 1, 2]]), array([[3, 4, 5]]), array([[6, 7, 8]])] 

同样,也可通过solit函数并指定轴为1来获得这样的效果:

>>> split(a, 3, axis=0) 

面向深度的分割

dsplit函数使用的是面向深度的分割方式:

>>> c = arange(27).reshape(3, 3, 3) >>> c 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],   [24, 25, 26]]]) >>> dsplit(c, 3) [array([[[ 0],   [ 3],   [ 6]],    [[ 9],   [12],   [15]],    [[18],   [21],   [24]]]),  array([[[ 1],   [ 4],   [ 7]],    [[10],   [13],   [16]],    [[19],   [22],   [25]]]),  array([[[ 2],   [ 5],   [ 8]],    [[11],   [14],   [17]],    [[20],   [23],   [26]]])] 

复制和镜像(View)

当运算和处理数组时,它们的数据有时被拷贝到新的数组有时不是。这通常是新手的困惑之源。这有三种情况:

完全不复制

简单的赋值,而不复制数组对象或它们的数据。

>>> a = arange(12) >>> b = a  #不创建新对象 >>> b is a   # a和b是同一个数组对象的两个名字 True >>> b.shape = 3,4 #也改变了a的形状 >>> a.shape (3, 4)     Python 传递不定对象作为参考4,所以函数调用不拷贝数组。 >>> def f(x): ...  print id(x) ... >>> id(a)  #id是一个对象的唯一标识 148293216 >>> f(a) 148293216 

视图(view)和浅复制

不同的数组对象分享同一个数据。视图方法创造一个新的数组对象指向同一数据。

>>> c = a.view() >>> c is a False >>> c.base is a  #c是a持有数据的镜像 True >>> c.flags.owndata False >>> >>> c.shape = 2,6 # a的形状没变 >>> a.shape (3, 4) >>> c[0,4] = 1234  #a的数据改变了 >>> a array([[ 0, 1, 2, 3],   [1234, 5, 6, 7],   [ 8, 9, 10, 11]]) 

切片数组返回它的一个视图:

>>> s = a[ : , 1:3]  # 获得每一行1,2处的元素 >>> s[:] = 10   # s[:] 是s的镜像。注意区别s=10 and s[:]=10 >>> a array([[ 0, 10, 10, 3],   [1234, 10, 10, 7],   [ 8, 10, 10, 11]]) 

深复制

这个复制方法完全复制数组和它的数据。

 >>> d = a.copy()  #创建了一个含有新数据的新数组对象 >>> d is a False >>> d.base is a  #d和a现在没有任何关系 False >>> d[0,0] = 9999 >>> a array([[ 0, 10, 10, 3],   [1234, 10, 10, 7],   [ 8, 10, 10, 11]]) 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


  • 上一条:
    解决pyqt中ui编译成窗体.py中文乱码的问题
    下一条:
    深入理解NumPy简明教程---数组2
  • 昵称:

    邮箱:

    0条评论 (评论内容有缓存机制,请悉知!)
    最新最热
    • 分类目录
    • 人生(杂谈)
    • 技术
    • linux
    • Java
    • php
    • 框架(架构)
    • 前端
    • ThinkPHP
    • 数据库
    • 微信(小程序)
    • Laravel
    • Redis
    • Docker
    • Go
    • swoole
    • Windows
    • Python
    • 苹果(mac/ios)
    • 相关文章
    • 在python语言中Flask框架的学习及简单功能示例(0个评论)
    • 在Python语言中实现GUI全屏倒计时代码示例(0个评论)
    • Python + zipfile库实现zip文件解压自动化脚本示例(0个评论)
    • python爬虫BeautifulSoup快速抓取网站图片(1个评论)
    • vscode 配置 python3开发环境的方法(0个评论)
    • 近期文章
    • 在go中实现一个常用的先进先出的缓存淘汰算法示例代码(0个评论)
    • 在go+gin中使用"github.com/skip2/go-qrcode"实现url转二维码功能(0个评论)
    • 在go语言中使用api.geonames.org接口实现根据国际邮政编码获取地址信息功能(1个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf分页文件功能(0个评论)
    • gmail发邮件报错:534 5.7.9 Application-specific password required...解决方案(0个评论)
    • 欧盟关于强迫劳动的规定的官方举报渠道及官方举报网站(0个评论)
    • 在go语言中使用github.com/signintech/gopdf实现生成pdf文件功能(0个评论)
    • Laravel从Accel获得5700万美元A轮融资(0个评论)
    • 在go + gin中gorm实现指定搜索/区间搜索分页列表功能接口实例(0个评论)
    • 在go语言中实现IP/CIDR的ip和netmask互转及IP段形式互转及ip是否存在IP/CIDR(0个评论)
    • 近期评论
    • 122 在

      学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..
    • 123 在

      Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..
    • 原梓番博客 在

      在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..
    • 博主 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..
    • 1111 在

      佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
    • 2016-10
    • 2016-11
    • 2018-04
    • 2020-03
    • 2020-04
    • 2020-05
    • 2020-06
    • 2022-01
    • 2023-07
    • 2023-10
    Top

    Copyright·© 2019 侯体宗版权所有· 粤ICP备20027696号 PHP交流群

    侯体宗的博客