在Numpy中,访问或修改数组中的元素,可以采用索引或切片的方式。
基本切片
slice()
构造切片对象
Numpy内置函数slice()
可以用来构造切片对象,通过它可以实现从原数组上切割出一个新的数组。
np.slice(start, stop, step)
import numpy as np
a = np.arange(10)
#生成切片对象
s = slice(2,9,3) # 从索引2开始到索引9停止,间隔时间为2
print(a[s]) # [2 5 8],输出方法:从区间数组中填入slice对象
冒号切片
一维数组切片
import numpy as np
a = np.arange(10)
b = a[2:9:3]
print(b) # [2 5 8]
多维数组切片
"..."
省略号如果在行位置使用,表示返回所有行元素;如果在列位置使用,表示返回所有列元素。
import numpy as np
#创建二维数组a
a = 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 np
a = np.array([1, 2, 3, 4, 5])
b = a[[0, 1, 2]]
print(b) # [1 2 3]
# 多维数组示例1
import numpy as np
x = 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
# 多维数组示例2
import numpy as np
b = 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 np
d = 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>
## 花式索引(拓展知识)
**花式索引与整数数组索引类似**,但在**多个索引数组中,略有不同**。
```python
import numpy as np
x=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]]
"""