深入理解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根据经纬度计算距离示例
Feb 16 Python
Python中让MySQL查询结果返回字典类型的方法
Aug 22 Python
Python配置文件解析模块ConfigParser使用实例
Apr 13 Python
Python中SOAP项目的介绍及其在web开发中的应用
Apr 14 Python
python实现随机梯度下降(SGD)
Mar 24 Python
单利模式及python实现方式详解
Mar 20 Python
利用Python在一个文件的头部插入数据的实例
May 02 Python
python的等深分箱实例
Nov 22 Python
基于Python实现人脸自动戴口罩系统
Feb 06 Python
Python要求O(n)复杂度求无序列表中第K的大元素实例
Apr 02 Python
python中random.randint和random.randrange的区别详解
Sep 20 Python
python函数超时自动退出的实操方法
Dec 28 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
三个类概括PHP的五种设计模式
2012/09/05 PHP
php实现的css文件背景图片下载器代码
2014/11/11 PHP
php中解析带中文字符的url函数分享
2015/01/20 PHP
支付宝接口开发集成支付环境小结
2015/03/17 PHP
[原创]php逐行读取txt文件写入数组的方法
2015/07/02 PHP
php文件上传类完整实例
2016/05/14 PHP
php使用scandir()函数扫描指定目录下所有文件示例
2019/06/08 PHP
PHP基于timestamp和nonce实现的防止重放攻击方案分析
2019/07/26 PHP
javascript中xml操作实现代码
2011/11/21 Javascript
JavaScript Ajax Json实现上下级下拉框联动效果实例代码
2013/11/23 Javascript
使用JavaScript获取电池状态的方法
2014/05/03 Javascript
全面解析Bootstrap图片轮播效果
2015/12/03 Javascript
js实现有过渡渐变效果的图片轮播相册(兼容IE,ff)
2016/01/19 Javascript
javascript计时器编写过程与实现方法
2016/02/29 Javascript
NodeJS连接MongoDB数据库时报错的快速解决方法
2016/05/13 NodeJs
JS+Canvas实现的俄罗斯方块游戏完整实例
2016/12/12 Javascript
AngularJS 霸道的过滤器小结
2017/04/26 Javascript
js脚本编写简单刷票投票系统
2017/06/27 Javascript
JS 组件系列之Bootstrap Table 冻结列功能IE浏览器兼容性问题解决方案
2017/06/30 Javascript
JS实现的按钮点击颜色切换功能示例
2017/10/19 Javascript
微信小程序实现图片压缩功能
2018/01/26 Javascript
Bootstrap Fileinput 4.4.7文件上传实例详解
2018/07/25 Javascript
vue  自定义组件实现通讯录功能
2018/09/30 Javascript
在python tkinter中Canvas实现进度条显示的方法
2019/06/14 Python
详解使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
2020/04/01 Python
阿迪达斯墨西哥官方网站:adidas墨西哥
2017/11/03 全球购物
英国家用电器折扣网站:Electrical Discount UK
2018/09/17 全球购物
ABOUT YOU罗马尼亚:超过600个时尚品牌
2019/09/19 全球购物
LACOSTE波兰官网:Polo衫、服装和鞋类
2020/09/29 全球购物
类和结构的区别
2012/08/15 面试题
会计电算化专业个人的自我评价
2013/11/24 职场文书
建筑经济管理专业求职信分享
2014/01/06 职场文书
调解员先进事迹材料
2014/02/07 职场文书
安全责任书范文
2014/08/25 职场文书
大学运动会加油稿200字(5篇)
2014/09/27 职场文书
python 字典和列表嵌套用法详解
2021/06/29 Python