Numpy数组对象的操作-索引机制、切片和迭代方法
前几篇博文我写了数组创建和数据运算,现在我们就来看一下数组对象的操作方法。使用索引和切片的方法选择元素,还有如何数组的迭代方法。
一、索引机制
1.一维数组
In [1]: a = np.arange(10,16) In [2]: a
Out[2]: array([10, 11, 12, 13, 14, 15])
#使用正数作为索引
In [3]: a[3]
Out[3]: 13
#还可以使用负数作为索引
In [4]: a[-4]
Out[4]: 12
#方括号中传入多数索引值,可同时选择多个元素
In [6]: a[[0,3,4]]
Out[6]: array([10, 13, 14])

2.二维数组
二维数组也被称为矩阵,是由行和列组成的。axes为2,用0轴表示行,用1表示列。[行索引,列索引]
In [14]: A
Out[14]:
array([[10, 11, 12],
[13, 14, 15],
[16, 17, 18]])
#取出第三行第二列的元素
In [15]: A[2,1]
Out[15]: 17
#可以使用方括号取出多个元素
In [17]: A[[[2,1],[1,2]]]
Out[17]: array([17, 15])

二、切片操作:抽取部分数组元素生成新数组
1.一维数组切片操作
In [26]: a = np.arange(10,20) In [27]: a[2:7]
Out[27]: array([12, 13, 14, 15, 16]) In [28]: a[5:8]
Out[28]: array([15, 16, 17]) #设置步长
In [30]: a[2:8:2]
Out[30]: array([12, 14, 16]) #省去第一个数,则认为是从0(第一个元素)开始的
In [31]: a[:8:2]
Out[31]: array([10, 12, 14, 16]) #省去第二个数,则认为是取最大索引值
In [32]: a[5::2]
Out[32]: array([15, 17, 19]) #省去第三个数,则认为步长为1
In [33]: a[5:8:]
Out[33]: array([15, 16, 17]) #省去前两个数,则认为是选取步长为X的所有元素
In [34]: a[::2]
Out[34]: array([10, 12, 14, 16, 18])
2.二维数组切片操作
二维数组的切片操作与一维数组差不多,只不过读了一个轴,那么方括号里面就要有两个值(使用逗号隔开),可以把逗号的左边和右边当做是一个一位数组,比如:A[0:2,0:2]
In [1]: A = np.arange(10,19).reshape(3,3) In [2]: A
Out[2]:
array([[10, 11, 12],
[13, 14, 15],
[16, 17, 18]])
#第一个索引使用了冒号,则代表取所有行,第二个索引是0,则代表选取第一列。即第一列的所有元素
In [3]: A[:,0]
Out[3]: array([10, 13, 16]) In [4]: A[0,:]
Out[4]: array([10, 11, 12])
#行选取了0:2,即第一第二行(冒号的右边表示结束值,不在选取范围之内),列也是一样的道理
In [5]: A[0:2,0:2]
Out[5]:
array([[10, 11],
[13, 14]])
#如果要选取不连续的元素,可以将这些索引放入一个数组内。下面就是选取了第一行和第三行,第一和第二列的元素
In [6]: A[[0,2],0:2]
Out[6]:
array([[10, 11],
[16, 17]])
3.注意:python对列表的切片得到的是数组的副本,而numpy数组切片得到的是指向相同缓冲区的视图。原数据改变,切片得到的数组也会随之改变。
三、数组的迭代
当我们用函数处理行、列或者单个元素时,会需要到数组的遍历。
1.一维数组,使用for..in循环即可
In [7]: a = np.arange(0,11) In [8]: a
Out[8]: array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) In [9]: for i in a:
...: print i
0
1
2
3
4
5
6
7
8
9
10
2.二维数组
也可以使用for循环,嵌套使用即可。但是实际上,你会发现它总是按照第一条轴对二维数组进行扫描。
In [10]: for row in A:
...: print row
...:
[10 11 12]
[13 14 15]
[16 17 18]
如果想遍历数组的每一个元素。可以循环遍历A.flat
In [13]: for i in A.flat:
...: print i
10
11
12
13
14
15
16
17
18
用for循环就显得没那么优雅了,numpy提供了一个更优雅的遍历方法:apply_along_axis(func,axis,arr),这个函数可以使用聚合函数对每一列或行进行处理,并返回一个数值作为结果。
这个函数接收三个参数,第一个是聚合函数,第二个是对应哪条轴(axis=0按列操作,axis=1按行操作),第三个是要处理的数组
In [14]: A
Out[14]:
array([[10, 11, 12],
[13, 14, 15],
[16, 17, 18]])
#axis为1,按行进行操作,则输出每行最大的值
In [15]: np.apply_along_axis(np.max,axis=1,arr=A)
Out[15]: array([12, 15, 18])
#输出每行的平均值
In [16]: np.apply_along_axis(np.mean,axis=1,arr=A)
Out[16]: array([ 11., 14., 17.])
其中,第一个参数可以传递自己写的函数
In [17]: def foo(x):
...: return x/2 In [18]: np.apply_along_axis(foo,axis=1,arr=A)
Out[18]:
array([[5, 5, 6],
[6, 7, 7],
[8, 8, 9]])
四、使用条件表达式和布尔运算符选择性地抽取元素
In [20]: B = np.random.random((3,3)) In [21]: B
Out[21]:
array([[ 0.11802695, 0.66445966, 0.06007488],
[ 0.31908974, 0.35200425, 0.64225707],
[ 0.60802331, 0.93322485, 0.28177795]]) #由条件表达式得到一个布尔数组
In [22]: B < 0.5
Out[22]:
array([[ True, False, True],
[ True, True, False],
[False, False, True]], dtype=bool)
#将条件表达式放在方括号中,可以抽取满足表达式的数组,组成一个新数组。
In [23]: B[B<0.5]
Out[23]: array([ 0.11802695, 0.06007488, 0.31908974, 0.35200425, 0.28177795])
五、总结
了解的数组的索引机制,对数组的切片操作,以及遍历。
Numpy数组对象的操作-索引机制、切片和迭代方法的更多相关文章
- Numpy系列(四)- 索引和切片
Python 中原生的数组就支持使用方括号([])进行索引和切片操作,Numpy 自然不会放过这个强大的特性. 单个元素索引 1-D数组的单元素索引是人们期望的.它的工作原理与其他标准Python序 ...
- numpy 数组对象
numpy 数组对象NumPy中的ndarray是一个多维数组对象,该对象由两部分组成:实际的数据,描述这些数据的元数据# eg_v1 import numpy as np a = np.arange ...
- js对数组对象的操作以及方法的使用
js对数组对象的操作以及方法的使用 如何声明创建一个数组对象: var arr = new Array(); 或者 var arr = []; 如何移除所有数组中数据? arrayJson.dataL ...
- NumPy 学习 第二篇:索引和切片
数组索引是指使用中括号 [] 来定位数据元素,不仅可以定位到单个元素,也可以定位到多个元素.索引基于0,并接受从数组末尾开始索引的负索引. 举个例子,正向索引从0开始,从数组开始向末尾依次加1递增:负 ...
- Numpy数组的基本运算操作
一.算术运算符 In [3]: a = np.arange(0,5) Out[3]array([0, 1, 2, 3, 4]) In [4]: a+4 Out[4]: array([4, 5, 6, ...
- Python数据分析学习(二):Numpy数组对象基础
1.1数组对象基础 .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { bord ...
- NumPy数组对象
1.创建NumPy数组 import numpy as np # 创建3*2*4的三维数组 a = np.arange(24).reshape(3, 2, 4) # 打印三维数组的所有元素 print ...
- Numpy:索引与切片
numpy基本的索引和切片 import numpy as np arr = np.array([1,2,3,555,666,888,10]) arr array([ 1, 2, 3, 555, 66 ...
- Python数据分析之numpy数组全解析
1 什么是numpy numpy是一个在Python中做科学计算的基础库,重在数值计算,也是大部分Python科学计算库的基础库,多用于大型.多维数据上执行数值计算. 在NumPy 中,最重要的对象是 ...
随机推荐
- [Python] 文科生零基础学编程系列一——对象、集合、属性、方法的基本定义
1.编程语言: 1.1是什么: 编程语言(programming language),是用来定义计算机程序的形式语言.它是一种被标准化的交流技巧,用来向计算机发出指令. 一种计算机语言让程序员能够准确 ...
- Linux文档的压缩与打包
linux系统中的后缀名其实要不要无所谓,但是对于压缩文件来讲必须要带上.这是为了判断压缩文件是由哪种压缩工具所压缩,而后才能去正确的解压缩这个文件.Linux压缩文件常见的后缀名所对应的压缩工具: ...
- bootstrap折叠调用collapse()后data-parent不生效问题
今天做的项目,用到了bootstrap的折叠功能,这个功能需要只展开一个折叠框,点击一个就会自动隐藏另一个,初始按照API做了一下,发现一切运行正常,但是测试的同事提了一个bug,说切换到其他模块后再 ...
- DNS主从服务部署
(1)节点信息 console01 主DNS 192.168.80.3 192.168.10.3 console02 从DNS 192.168.80.4 192.168.10.4 (2)环境部署 # ...
- Python Web框架篇:Django Model ORM(对象关系映射)
一,基本操作 用于实现面向对象编程语言里不同类型系统的数据之间的转换,换言之,就是用面向对象的方式去操作数据库的创建表以及增删改查等操作. 1.增(create , save): from app01 ...
- Python迭代
本篇将介绍Python的迭代,更多内容请参考:Python学习指南 简介 在Python中,如果给定一个list或者tuple,我们可以通过for循环来遍历这个list或者tuple,这种遍历我们称为 ...
- 套接字(linux相关)
前言:略 一.前因 一切从tcp.udp开始. 众所周知,网络模型一般有两种模型,一种为OSI概念模型(七层),另一种为tcp/ip网络模型(四层). tcp/ip应用层对应OSI的应用层.显示层.会 ...
- dfs序和欧拉序
生命不息,学习不止,昨天学了两个算法,总结一下,然而只是略懂,请路过的大佬多多谅解. 一.dfs序 1.什么是dfs序? 其实完全可以从字面意义上理解,dfs序就是指一棵树被dfs时所经过的节点的 ...
- awk详解 数组
第1章 awk命令基础 1.1 awk命令执行过程 1.如果BEGIN 区块存在,awk执行它指定的动作. 2.awk从输入文件中读取一行,称为一条输入记录.如果输入文件省略,将从标准输入读取 3.a ...
- Problem H: STL——括号匹配
Description 给出一堆括号,看其是否匹配,例如 ().()().(()) 这样的括号就匹配, )(.)()) 而这样的括号就不匹配 Input 每一行代表一组测试样例,每组测试样 ...