NumPy-数组索引
NumPy-切片和索引
- ndarray 对象的内容可以通过索引或切片来访问和修改,与 Python 中 list 的切片操作一样
索引
-
ndarray 数组可以基于 0 - n 的下标进行索引
import numpy as np a = np.arange(10) # [0 1 2 3 4 5 6 7 8 9] b = a[5] print(b) # 输出 5
切片
-
slice 函数进行切片
-
切片对象可以通过内置的 slice 函数,并设置 start, stop 及 step 参数进行,从原数组中切割出一个新数组。
-
例子
import numpy as np a = np.arange(10) s = slice(2,7,2) # 从索引 2 开始到索引 7 停止,间隔为2 print (a[s]) # 输出 [2 4 6]
-
-
通过索引提取切片
-
可以通过冒号分隔切片参数 start:stop:step 来进行切片操作
import numpy as np a = np.arange(10) b = a[2:7:2] # 从索引 2 开始到索引 7 停止,间隔为 2 print(b) # 输出 [2 4 6]
-
如果只放置一个参数,如 [2],将返回与该索引相对应的单个元素。
-
如果为 [2:],表示从该索引开始以后的所有项都将被提取。
import numpy as np a = np.arange(10) print(a[2:]) # 输出 [2 3 4 5 6 7 8 9]
-
如果使用了两个参数,如 [2:7],那么则提取两个索引(不包括停止索引)之间的项。
import numpy as np a = np.arange(10) # [0 1 2 3 4 5 6 7 8 9] print(a[2:5]) # 输出 [2 3 4]
-
多维数组同样适用上述索引提取方法
import numpy as np a = np.array([[1,2,3],[3,4,5],[4,5,6]]) print(a) # 从某个索引处开始切割 print('从数组索引 a[1:] 处开始切割') print(a[1:]) # 输出 [[1 2 3] [3 4 5] [4 5 6]] 从数组索引 a[1:] 处开始切割 [[3 4 5] [4 5 6]]
-
切片还可以包括省略号 …,来使选择元组的长度与数组的维度相同。 如果在行位置使用省略号,它将返回包含行中元素的 ndarray。
import numpy as np a = np.array([[1,2,3],[3,4,5],[4,5,6]]) print (a[... , 1]) # 第2列元素 print (a[1 , ...]) # 第2行元素 print (a[..., 1:]) # 第2列及剩下的所有元素 # 输出 [2 4 5] [3 4 5] [[2 3] [4 5] [5 6]]
-
NumPy-高级索引
整数数组索引
-
整数数组索引是指使用一个数组来访问另一个数组的元素。这个数组中的每个元素都是目标数组中某个维度上的索引值。
-
例子
-
获取数组中 (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]] #行索引分别为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 ('我们的数组是:' ) print (x) print ('\n') rows = np.array([[0,0],[3,3]]) # 行索引分别为0,0,3,3 cols = np.array([[0,2],[0,2]]) # 列索引分别为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]]
-
可以借助切片 : 或 … 与索引数组组合。
import numpy as np a = np.array([[1,2,3], [4,5,6],[7,8,9]]) b = a[1:3, 1:3] #行索引为1,2 列索引为1,2 c = a[1:3,[1,2]] #行索引为1,2 列索引为1,2 d = a[...,1:] #列索引为1,2 print(b) print(c) print(d) # 输出 [[5 6] [8 9]] [[5 6] [8 9]] [[2 3] [5 6] [8 9]]
-
布尔索引
-
布尔索引通过布尔运算(如:比较运算符)来获取符合指定条件的元素的数组。
-
例子
-
获取大于 5 的元素
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]
-
使用了 ~(取补运算符)来过滤 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]
-
花式索引
- 花式索引指的是利用整数数组进行索引。
- 花式索引根据索引数组的值作为目标数组的某个轴的下标来取值。
- 对于使用一维整型数组作为索引
- 如果目标是一维数组,那么索引的结果就是对应位置的元素
- 如果目标是二维数组,那么就是对应下标的行。
一维数组
-
一维数组只有一个轴 axis = 0,所以一维数组就在 axis = 0 这个轴上取值
-
例子
import numpy as np x = np.arange(9) print(x) # 一维数组读取指定下标对应的元素 print("-------读取下标对应的元素-------") x2 = x[[0, 6]] # 使用花式索引 print(x2) print(x2[0]) print(x2[1]) # 输出 [0 1 2 3 4 5 6 7 8] -------读取下标对应的元素------- [0 6] 0 6
二维数组
-
传入顺序索引数组
import numpy as np x=np.arange(32).reshape((8,4)) print(x) # 二维数组读取指定下标对应的行 print("-------读取下标对应的行-------") print (x[[4,2,1,7]]) # 输出 [[ 0 1 2 3] [ 4 5 6 7] [ 8 9 10 11] [12 13 14 15] [16 17 18 19] [20 21 22 23] [24 25 26 27] [28 29 30 31]] -------读取下标对应的行------- [[16 17 18 19] [ 8 9 10 11] [ 4 5 6 7] [28 29 30 31]]
-
传入倒序索引数组
import numpy as np x=np.arange(32).reshape((8,4)) print (x[[-4,-2,-1,-7]]) # 输出 [[16 17 18 19] [24 25 26 27] [28 29 30 31] [ 4 5 6 7]]
-
传入多个索引数组(要使用 np.ix_)。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])]) #索引分别为 [1][0],[1][3],[1][1],[1][2] [5][0],[5][3],[5][1],[5][2] [7][0],[7][3],[7][1],[7][2] [2][0],[2][3],[2][1],[2][2] # 输出 [[ 4 7 5 6] [20 23 21 22] [28 31 29 30] [ 8 11 9 10]]