在Numpy中,访问或修改数组中的元素,可以采用索引或切片的方式。
基本切片
slice()构造切片对象
Numpy内置函数slice()可以用来构造切片对象,通过它可以实现从原数组上切割出一个新的数组。
np.slice(start, stop, step)
import numpy as npa = np.arange(10)#生成切片对象s = slice(2,9,3) # 从索引2开始到索引9停止,间隔时间为2print(a[s]) # [2 5 8],输出方法:从区间数组中填入slice对象
冒号切片
一维数组切片
import numpy as npa = np.arange(10)b = a[2:9:3]print(b) # [2 5 8]
多维数组切片
"..."省略号如果在行位置使用,表示返回所有行元素;如果在列位置使用,表示返回所有列元素。
import numpy as np#创建二维数组aa = np.array([[1,2,3],[3,4,5],[4,5,6]])#返回数组的第二列print (a[...,1])#返回数组的第二行print (a[1,...])#返回第二列后的所有项print (a[...,1:])
高级索引
整数数组索引
高级索引返回的是数组的副本(深拷贝),而切片操作返回的是数组视图(浅拷贝)。
- 以列表的方式填充下标。 ```python a = b[rows, cols]
其中: rows与cols按顺序组合构成多个索引。
```python# 一维数组示例import numpy as npa = np.array([1, 2, 3, 4, 5])b = a[[0, 1, 2]]print(b) # [1 2 3]# 多维数组示例1import numpy as npx = np.array([[1, 2], [3, 4], [5, 6]])#[0,1,2]代表行索引;[0,1,0]代表列索引y = x[[0,1,2],[0,1,0]] # 行索引与列索引按顺序组合构成索引print (y) # [1 4 5]# 多维数组示例2# 多维数组示例2import numpy as npb = np.array([[0, 1, 2],[3, 4, 5],[6, 7, 8],[9, 10, 11]])r = np.array([[0, 0], [3, 3]]) # 以数组的方式建立行索引c = np.array([[0, 2], [0, 2]]) # 以数组的方式建立列索引# 获取四个角的元素c = b[r, c] # 可先简化为单一的数组元素,如a进行理解,最后再单独拆解即可print(c) # [[ 0 2] [ 9 11]]
将:或...符与整数数组结合使用
import numpy as npd = np.array([[0, 1, 2],[3, 4, 5],[6, 7, 8],[9, 10, 11]])# 对行列分别进行切片e = d[1:4, 1:3]print(e)# 行使用基础索引,对列使用高级索引f = d[1:4, [1, 2]] # [1,2]代表的是列索引,因此可以一维的整数数组索引解析# 显示切片后结果print(f)# 对行使用省略号h = d[..., 1:]print(h)
布尔数组索引
当输出的结果需要进行布尔运算时,需要使用布尔数组索引。
x = np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]]) print (x[x > 6]) # [7 8 9 10 11]返回的是一维数组
使用补码运算符(~)除去 NaN 数据
import numpy as np
a = np.array([np.nan, 1,2,np.nan,3,4,5]) print(a[~np.isnan(a)) # [ 1. 2. 3. 4. 5.]
删除复数中的整数
import numpy as np
a = np.array([1, 2+6j, 5, 3.5+5j]) print( a[np.iscomplex(a)]) # [2.0+6.j 3.5+5.j]
<a name="OjJCC"></a>## 花式索引(拓展知识)**花式索引与整数数组索引类似**,但在**多个索引数组中,略有不同**。```pythonimport numpy as npx=np.arange(32).reshape((8,4))print (x[np.ix_([1,5,7,2],[0,3,1,2])]) # 需要添加np.ix_符表示花式索引# 输出结果如下:(与整数数组索引的按顺序行列组合不同,其列索引直接进行了对应排序)"""[[ 4 7 5 6][20 23 21 22][28 31 29 30][ 8 11 9 10]]"""
