一、基础索引和切片
Numpy是Python的一种开源的科学计算库,在进行科学和工程计算的时候,使用Numpy进行数组操作,可以避免Python列表的性能问题。Numpy中提供了丰富的数组操作,本文主要介绍优化数组操作的技巧——Numpy索引。
首先介绍Numpy的基础索引和切片,这也是大部分读者比较熟悉的操作。Numpy数组的索引和Python列表的索引类似。我们可以通过中括号来访问数组中的元素,如下:
import numpy as np a = np.array([1, 2, 3, 4, 5, 6]) print(a[0]) # 输出第一个元素 print(a[-1]) # 输出最后一个元素
输出结果为:
1 6
对于多维数组,我们可以使用逗号分隔的索引元组来访问元素。如下:
b = np.array([[1, 2, 3], [4, 5, 6], [7, 8 , 9]]) print(b[0, 0]) # 输出第一个元素 print(b[1, 2]) # 输出第二行第三列的元素
输出结果为:
1 6
除了基础的索引外,对于数组的切片,我们也可以使用类似Python列表的方式来进行:
c = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9]) print(c[1:5]) # 输出索引1到4的元素 print(c[:5]) # 输出前五个元素 print(c[4:]) # 输出从索引4开始的所有元素 print(c[:-1]) # 输出除了最后一个元素外的所有元素
输出结果为:
[2 3 4 5] [1 2 3 4 5] [5 6 7 8 9] [1 2 3 4 5 6 7 8]
二、高级索引
除了基础索引和切片外,Numpy还提供了高级索引。高级索引包括整数索引和布尔索引。
1. 整数索引
整数索引就是指我们以整数数组的形式来获取数组中的元素。如下:
import numpy as np a = np.array([[1, 2], [3, 4], [5, 6]]) print(a[[0, 1, 2], [0, 1, 0]]) # 输出第一个、第二个和第三个元素的第一个和第二个值
输出结果为:
[1 4 5]
上述代码使用了整数数组 [0, 1, 2] 和 [0, 1, 0] 来获取数组 a 中的元素。这相当于输出了 a[0, 0]、a[1, 1] 和 a[2, 0] 三个元素的值。
2. 布尔索引
布尔索引就是指我们通过布尔表达式的返回值来获取数组中的元素。如下:
import numpy as np a = np.array([[1, 2], [3, 4], [5, 6]]) print(a[a > 3]) # 输出数组 a 中大于 3 的元素
输出结果为:
[4 5 6]
上述代码使用了 a > 3 这个布尔表达式来获取数组中大于 3 的元素。
三、花式索引
花式索引是指我们利用整数数组来进行索引。这个数组可以是任何形状的,只要符合广播规则即可。
1. 使用整数数组进行索引
使用整数数组进行索引时,我们可以将需要获取的行和列分开使用整数数组进行获取。如下:
import numpy as np a = np.array([[1, 2], [3, 4], [5, 6]]) print(a[[0, 1], [1, 0]]) # 输出第一行第二列和第二行第一列的元素
输出结果为:
[2 3]
上述代码中,使用了整数数组 [0, 1] 和 [1, 0] 来获取数组 a 中的元素 a[0, 1] 和 a[1, 0]。
2. 使用布尔数组进行索引
使用布尔数组进行索引时,布尔数组的形状与需要获取的数据的形状一致。如下:
import numpy as np a = np.array([[1, 2], [3, 4], [5, 6]]) b = np.array([True, False, True]) print(a[b, :]) # 输出 a 的第一行和第三行
输出结果为:
[[1 2] [5 6]]
上述代码中,使用布尔数组 [True, False, True] 来获取数组 a 中的第一行和第三行。
3. 使用切片和整数数组进行索引
使用切片和整数数组进行索引时,相当于把切片和整数数组混合使用。如下:
import numpy as np a = np.array([[1, 2], [3, 4], [5, 6]]) print(a[1:, [0, 1]]) # 输出第二行和第三行的第一列和第二列的元素
输出结果为:
[[3 4] [5 6]]
上述代码中,使用切片和整数数组 [0, 1] 来获取数组 a 中的第二行和第三行的第一列和第二列的元素。
四、布尔数组的操作
除了使用布尔数组进行索引外,我们还可以对布尔数组进行操作,获取一些常用的功能。
1. 判断数组中是否存在某个值
我们可以使用 np.any 函数来判断数组中是否存在某个值。如下:
import numpy as np a = np.array([[1, 2], [3, 4], [5, 6]]) print(np.any(a == 1)) # 判断数组 a 中是否存在值为 1 的元素
输出结果为:
True
上述代码使用 np.any(a == 1) 来判断数组 a 中是否存在值为 1 的元素。
2. 使用布尔数组进行筛选
我们可以使用布尔数组进行筛选,获取满足条件的元素。如下:
import numpy as np a = np.array([[1, 2], [3, 4], [5, 6]]) b = a[a > 3] print(b) # 输出数组 a 中大于 3 的元素
输出结果为:
[4 5 6]
上述代码使用 a > 3 这个布尔表达式来获取数组 a 中大于 3 的元素。
总结
Numpy的索引操作非常丰富,使用不同的索引方式可以方便地获取数组中的元素。在实际应用中,我们应该根据自己的需求选择最适合的索引方式,以优化数组操作的效率。