深入理解NumPy简明教程---数组2


Posted in Python onDecember 17, 2016

NumPy数组(2、数组的操作)

基本运算

数组的算术运算是按元素逐个运算。数组运算后将创建包含运算结果的新数组。

>>> a= np.array([20,30,40,50]) 
>>> b= np.arange( 4) 
>>> b 
array([0, 1, 2, 3]) 
>>> c= a-b 
>>> c 
array([20, 29, 38, 47]) 
>>> b**2 
array([0, 1, 4, 9]) 
>>> 10*np.sin(a) 
array([ 9.12945251,-9.88031624, 7.4511316, -2.62374854]) 
>>> a<35 
array([True, True, False, False], dtype=bool)

与其他矩阵语言不同,NumPy中的乘法运算符*按元素逐个计算,矩阵乘法可以使用dot函数或创建矩阵对象实现(后续章节会介绍)

>>> A= np.array([[1,1], 
...[0,1]]) 
>>> B= np.array([[2,0], 
...[3,4]]) 
>>> A*B # 逐个元素相乘 
array([[2, 0], 
   [0, 4]]) 
>>> np.dot(A,B) # 矩阵相乘 
array([[5, 4], 
  
 [3, 4]])

有些操作符如+=和*=用来更改已存在数组而不创建一个新的数组。

>>> a= np.ones((2,3), dtype=int) 
>>> b= np.random.random((2,3)) 
>>> a*= 3 
>>> a 
array([[3, 3, 3], 
   [3, 3, 3]]) 
>>> b+= a 
>>> b 
array([[ 3.69092703, 3.8324276, 3.0114541], 
  
  [ 3.18679111, 3.3039349, 3.37600289]]) 
>>> a+= b # b转换为整数类型 
>>> a 
array([[6, 6, 6], 
      [6, 6, 6]])

当数组中存储的是不同类型的元素时,数组将使用占用更多位(bit)的数据类型作为其本身的数据类型,也就是偏向更精确的数据类型(这种行为叫做upcast)。

>>> a= np.ones(3, dtype=np.int32) 
>>> b= np.linspace(0,np.pi,3) 
>>> b.dtype.name 
'float64' 
>>> c= a+b 
>>> c 
array([ 1., 2.57079633, 4.14159265]) 
>>> c.dtype.name 
'float64' 
>>> d= exp(c*1j) 
>>> d 
array([ 0.54030231+0.84147098j,-0.84147098+0.54030231j, 
    -0.54030231-0.84147098j]) 
>>> d.dtype.name 
'complex128'

许多非数组运算,如计算数组所有元素之和,都作为ndarray类的方法来实现,使用时需要用ndarray类的实例来调用这些方法。

>>> a= np.random.random((2,3)) 
>>> a 
array([[ 0.65806048, 0.58216761, 0.59986935], 
      [ 0.6004008, 0.41965453, 0.71487337]]) 
>>> a.sum() 
  3.5750261436902333 
>>> a.min() 
   0.41965453489104032 
>>> a.max() 
   0.71487337095581649

这些运算将数组看作是一维线性列表。但可通过指定axis参数(即数组的行)对指定的轴做相应的运算:

>>> b= np.arange(12).reshape(3,4) 
>>> b 
array([[ 0, 1, 2, 3], 
      [ 4, 5, 6, 7], 
      [ 8, 9, 10, 11]]) 
>>> b.sum(axis=0) # 计算每一列的和,注意理解轴的含义,参考数组的第一篇文章 
array([12, 15, 18, 21]) 
>>> b.min(axis=1) # 获取每一行的最小值 
array([0, 4, 8]) 
>>> b.cumsum(axis=1) # 计算每一行的累积和 
array([[ 0, 1, 3, 6], 
      [ 4, 9, 15, 22], 
      [ 8, 17, 27, 38]])

索引,切片和迭代

和列表和其它Python序列一样,一维数组可以进行索引、切片和迭代操作。

>>> a= np.arange(10)**3 #记住,操作符是对数组中逐元素处理的! 
>>> a 
array([0, 1, 8, 27, 64, 125, 216, 343, 512, 729]) 
>>> a[2] 
8 
>>> a[2:5] 
array([ 8, 27, 64]) 
>>> a[:6:2]= -1000 # 等同于a[0:6:2]= -1000,从开始到第6个位置,每隔一个元素将其赋值为-1000 
>>> a 
array([-1000, 1,-1000, 27,-1000, 125, 216, 343, 512, 729]) 
>>> a[: :-1] # 反转a 
array([ 729, 512, 343, 216, 125,-1000, 27,-1000, 1,-1000]) 
>>>for i in a: 
...  print i**(1/3.), 
... 
nan 1.0 nan 3.0 nan 5.0 6.0 7.0 8.0 9.0

多维数组可以每个轴有一个索引。这些索引由一个逗号分割的元组给出。

>>>def f(x,y): 
...  return 10*x+y 
... 
>>> b= np.fromfunction(f,(5,4),dtype=int) #fromfunction是一个函数,下篇文章介绍。 
>>> b 
array([[ 0, 1, 2, 3], 
      [10, 11, 12, 13], 
      [20, 21, 22, 23], 
      [30, 31, 32, 33], 
      [40, 41, 42, 43]]) 
>>> b[2,3] 
23 
>>> b[0:5, 1] # 每行的第二个元素 
array([ 1, 11, 21, 31, 41]) 
>>> b[: ,1] # 与前面的效果相同 
array([ 1, 11, 21, 31, 41]) 
>>> b[1:3,: ] # 每列的第二和第三个元素 
array([[10, 11, 12, 13], 
      [20, 21, 22, 23]])

当少于提供的索引数目少于轴数时,已给出的数值按秩的顺序复制,确失的索引则默认为是整个切片:

>>> b[-1] # 最后一行,等同于b[-1,:],-1是第一个轴,而缺失的认为是:,相当于整个切片。 
array([40, 41, 42, 43])

 b[i]中括号中的表达式被当作i和一系列:,来代表剩下的轴。NumPy也允许你使用“点”像b[i,...]。

点(…)代表许多产生一个完整的索引元组必要的分号。如果x是秩为5的数组(即它有5个轴),那么:

 

  • x[1,2,…] 等同于 x[1,2,:,:,:], 
  • x[…,3] 等同于 x[:,:,:,:,3]
  • x[4,…,5,:] 等同 x[4,:,:,5,:] 
>>> c= array( [ [[ 0, 1, 2], #三维数组(两个2维数组叠加而成) 
...[ 10, 12, 13]], 
... 
...[[100,101,102], 
...[110,112,113]]] ) 
>>> c.shape 
 (2, 2, 3) 
>>> c[1,...] #等同于c[1,:,:]或c[1] 
array([[100, 101, 102], 
      [110, 112, 113]]) 
>>> c[...,2] #等同于c[:,:,2] 
array([[ 2, 13], 
      [102, 113]])

多维数组的遍历是以是第一个轴为基础的:

>>>for row in b: 
...  print row 
... 
[0 1 2 3] 
[10 11 12 13] 
[20 21 22 23] 
[30 31 32 33] 
[40 41 42 43]

如果想对数组中每个元素都进行处理,可以使用flat属性,该属性是一个数组元素迭代器:

>>>for element in b.flat: 
...  print element, 
... 
0 1 2 3 10 11 12 13 20 21 22 23 30 31 32 33 40 41 42 43

更多关于[]、…、newaxis、ndenumerate、indices、index exp的内容请参考NumPy示例

形状(shape)操作

更改数组的形状

数组的形状取决于其每个轴上的元素个数:

>>> a= np.floor(10*np.random.random((3,4))) 
>>> a 
array([[ 7., 5., 9., 3.], 
      [ 7., 2., 7., 8.], 
      [ 6., 8., 3., 2.]]) 
>>> a.shape 
(3, 4)

可以用多种方式修改数组的形状:

>>> a.ravel() # 平坦化数组 
array([ 7., 5., 9., 3., 7., 2., 7., 8., 6., 8., 3., 2.]) 
>>> a.shape= (6, 2) 
>>> a.transpose() 
array([[ 7., 9., 7., 7., 6., 3.], 
      [ 5., 3., 2., 8., 8., 2.]])

由ravel()展平的数组元素的顺序通常是“C风格”的,就是以行为基准,最右边的索引变化得最快,所以元素a[0,0]之后是a[0,1]。如果数组改变成其它形状(reshape),数组仍然是“C风格”的。NumPy通常创建一个以这个顺序保存数据的数组,所以ravel()通常不需要创建起调用数组的副本。但如果数组是通过切片其它数组或有不同寻常的选项时,就可能需要创建其副本。还可以同过一些可选参数函数让reshape()和ravel()构建FORTRAN风格的数组,即最左边的索引变化最快。

reshape函数改变调用数组的形状并返回该数组,而resize函数改变调用数组自身。

>>> a 
array([[ 7., 5.], 
      [ 9., 3.], 
      [ 7., 2.], 
      [ 7., 8.], 
      [ 6., 8.], 
      [ 3., 2.]]) 
>>> a.resize((2,6)) 
>>> a 
array([[ 7., 5., 9., 3., 7., 2.], 
      [ 7., 8., 6., 8., 3., 2.]])

如果在reshape操作中指定一个维度为-1,那么其准确维度将根据实际情况计算得到

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

Python 相关文章推荐
跟老齐学Python之编写类之三子类
Oct 11 Python
Python类属性与实例属性用法分析
May 09 Python
python实现井字棋游戏
Mar 30 Python
python编程实现12306的一个小爬虫实例
Dec 27 Python
Python给你的头像加上圣诞帽
Jan 04 Python
Python之dict(或对象)与json之间的互相转化实例
Jun 05 Python
使用PyQt4 设置TextEdit背景的方法
Jun 14 Python
python实现的读取网页并分词功能示例
Oct 29 Python
Python大数据之从网页上爬取数据的方法详解
Nov 16 Python
解决django的template中如果无法引用MEDIA_URL问题
Apr 07 Python
Python获取浏览器窗口句柄过程解析
Jul 25 Python
解决Django transaction进行事务管理踩过的坑
Apr 24 Python
深入理解NumPy简明教程---数组1
Dec 17 #Python
Python脚本获取操作系统版本信息
Dec 17 #Python
详解python中xlrd包的安装与处理Excel表格
Dec 16 #Python
详解python开发环境搭建
Dec 16 #Python
python制作爬虫爬取京东商品评论教程
Dec 16 #Python
python用模块zlib压缩与解压字符串和文件的方法
Dec 16 #Python
Python用UUID库生成唯一ID的方法示例
Dec 15 #Python
You might like
BBS(php &amp; mysql)完整版(四)
2006/10/09 PHP
PHP调用Twitter的RSS的实现代码
2010/03/10 PHP
PHP下利用header()函数设置浏览器缓存的代码
2010/09/01 PHP
php无限极分类递归排序实现方法
2014/11/11 PHP
php格式文件打开的四种方法
2018/02/24 PHP
PHP中散列密码的安全性分析
2019/07/26 PHP
HTA版JSMin(省略修饰语若干)基于javascript语言编写
2009/12/24 Javascript
javascript温习的一些笔记 基础常用知识小结
2011/06/22 Javascript
JS中attr和prop属性的区别以及优先选择示例介绍
2014/06/30 Javascript
JavaScript控制listbox列表框的项目上下移动的方法
2015/03/18 Javascript
浅谈jquery中delegate()与live()
2015/06/22 Javascript
详解Webwork中Action 调用的方法
2016/02/02 Javascript
基于JavaScript+HTML5 实现打地鼠小游戏逻辑流程图文详解(附完整代码)
2017/11/02 Javascript
详解React 在服务端渲染的实现
2017/11/16 Javascript
Javascript中JSON数据分组优化实践及JS操作JSON总结
2017/12/22 Javascript
完美解决mui框架off-canvas侧滑超出部分隐藏无法滚动的问题
2018/01/25 Javascript
vue 移动端注入骨架屏的配置方法
2019/06/25 Javascript
简单了解Vue + ElementUI后台管理模板
2020/04/07 Javascript
python入门教程之识别验证码
2017/03/04 Python
python 爬虫出现403禁止访问错误详解
2017/03/11 Python
Python编程实现正则删除命令功能
2017/08/30 Python
Python3导入CSV文件的实例(跟Python2有些许的不同)
2018/06/22 Python
Django数据库操作之save与update的使用
2020/04/01 Python
Python虚拟环境库virtualenvwrapper安装及使用
2020/06/17 Python
Python3基于plotly模块保存图片表格
2020/08/03 Python
python 爬虫之selenium可视化爬虫的实现
2020/12/04 Python
Scrapy+Selenium自动获取cookie爬取网易云音乐个人喜爱歌单
2021/02/01 Python
Kathmandu美国网站:新西兰户外运动品牌
2019/03/23 全球购物
空指针到底是什么
2012/08/07 面试题
致短跑运动员广播稿
2014/01/09 职场文书
医院保洁服务方案
2014/06/11 职场文书
2014年法院工作总结
2014/11/24 职场文书
2015年环境监察工作总结
2015/07/23 职场文书
Nginx域名转发https访问的实现
2021/03/31 Servers
如何在Mac上通过docker配置PHP开发环境
2021/05/29 PHP
Golang实现可重入锁的示例代码
2022/05/25 Golang