文章目录
- 1. 索引
- 1.1 一维数组
- 1.2 多维数组
- 2. 切片
- 2.1 slice 函数或start:stop:step
- 2.2 省略号‘...’选择数组的维度
- 2.2 多维数组切片
- 2.3 整数数组索引
- 2.4 布尔索引
- 2.5 花式索引
1. 索引
获取数组中特定位置元素的过程。与 Python 中 list 的操作一样,ndarray 数组可以基于 0 - n 的下标进行索引。
1.1 一维数组
import numpy as np
a = np.array([9,8,7,6,5])
print(a[2])
输出结果为:
7
1.2 多维数组
import numpy as np
a = np.arange(24).reshape((2, 3, 4))
print(a)
print(a[1, 2, 3]) # 第2个数组,第3行,第4列的元素
print(a[0, 1, 2]) # 第1个数组,第2行,第3列的元素
输出结果为:
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]23
6
2. 切片
获取数组元素子集的过程,切片对象可以通过内置的 slice 函数,并设置 start, stop 及 step 参数进行,从原数组中切割出一个新数组。
2.1 slice 函数或start:stop:step
import numpy as np
a = np.arange(10) # [0 1 2 3 4 5 6 7 8 9]
s = slice(2,7,2) # 从索引 2 开始到索引 7 停止,间隔为2
print (a[s])
#start:stop:step
b = a[2:7:2] # 从索引 2 开始到索引 7 停止,间隔为2
print(b)
#如果只放置一个参数,如 [2],将返回与该索引相对应的单个元素。
#如果为 [2:],表示从该索引开始以后的所有项都将被提取。
#如果使用了两个参数,如 [2:5],那么则提取两个索引(不包括停止索引)之间的项
print(a[2:5])
输出结果为:
[2 4 6]
[2 4 6]
[2 3 4]
2.2 省略号‘…’选择数组的维度
import numpy as np
a = np.array([[1,2,3],[3,4,5],[4,5,6]])
print(a[1:]) # 从某个索引处开始切割
print (a[...,1]) # 第2列元素
print (a[1,...]) # 第2行元素
输出结果为:
[[3 4 5]
[4 5 6]][2 4 5]
[3 4 5]
2.2 多维数组切片
import numpy as np
a = np.arange(24).reshape((2, 3, 4))
print(a)
print(a[:, 1, -3]) # 全部数组,第2行,倒数第3的元素
输出结果为:
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]][ 5 17]
指定行切片:
import numpy as np
a = np.arange(24).reshape((2, 3, 4))
print(a[:, 1:3, :]) # 全部数组,第2、3行,所有列的元素
print(a[:, :, ::2]) # 全部数组,所有行,步长为2的元素
输出结果为:
[[[ 4 5 6 7]
[ 8 9 10 11]]
[[16 17 18 19]
[20 21 22 23]]][[[ 0 2]
[ 4 6]
[ 8 10]]
[[12 14]
[16 18]
[20 22]]]
2.3 整数数组索引
以下实例获取数组中(0,0),(1,1)和(2,0)位置处的元素
import numpy as np
x = np.array([[1, 2], [3, 4], [5, 6]])
y = x[[0,1,2], [0,1,0]]
print (y)
输出结果为:
[1 4 5]
以下实例获取了 4X3 数组中的四个角的元素。 行索引是 [0,0] 和 [3,3],而列索引是 [0,2] 和 [0,2]。
import numpy as np
x = np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]])
print (x)
print ('\n')
#相当于直接找 x[[0, 0, 3, 3],[0, 2, 0, 2]
rows = np.array([[0,0],[3,3]])
cols = np.array([[0,2],[0,2]])
y = x[rows,cols]
print ('这个数组的四个角元素是:')
print (y)
输出结果为:
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
这个数组的四个角元素是:
[[ 0 2]
[ 9 11]]
2.4 布尔索引
我们可以通过一个布尔数组来索引目标数组。
布尔索引通过布尔运算(如:比较运算符)来获取符合指定条件的元素的数组。
import numpy as np
x = np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]])
print ('我们的数组是:')
print (x)
print ('\n')
# 获取大于 5 的元素
print ('大于 5 的元素是:')
print (x[x > 5])
我们的数组是:
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
大于 5 的元素是:
[ 6 7 8 9 10 11]
2.5 花式索引
花式索引指的是利用整数数组进行索引。
花式索引根据索引数组的值作为目标数组的某个轴的下标来取值。对于使用一维整型数组作为索引,如果目标是一维数组,那么索引的结果就是对应位置的元素;如果目标是二维数组,那么就是对应下标的行。
花式索引跟切片不一样,它总是将数据复制到新数组中。
2.5.1 传入顺序索引数组
import numpy as np
x=np.arange(32).reshape((8,4))
print (x[[4,2,1,7]])
输出结果为:
[[16 17 18 19]
[ 8 9 10 11]
[ 4 5 6 7]
[28 29 30 31]]
2.5.2 传入倒序索引数组
import numpy as np
x=np.arange(32).reshape((8,4))
print (x[[-4,-2,-1,-7]])
输出结果为:
[[16 17 18 19]
[ 8 9 10 11]
[ 4 5 6 7]
[28 29 30 31]]
2.5.3 传入多个索引数组(要使用np.ix_)
import numpy as np
x=np.arange(32).reshape((8,4))
print (x[np.ix_([1,5,7,2],[0,3,1,2])])
#如果 np.xi_ 中输入两个列表,则第一个列表存的是待提取元素的行标
#第二个列表存的是待提取元素的列标。
输出结果为:
[[ 4 7 5 6]
[20 23 21 22]
[28 31 29 30]
[ 8 11 9 10]]