Numpy 快速的Fancy Indexing
在本文中,我们将介绍Numpy中的Fancy Indexing,这是一种快速的操作,允许您通过一组索引从数组中选择特定的值,以及执行其他高级的数据操作。
Fancy Indexing指的是使用序列或布尔值数组作为索引来访问数组中的元素。在Numpy中,我们可以使用整数、布尔值或由这些类型混合组成的集合作为索引,以便快速地选择特定的元素。
阅读更多:Numpy 教程
Fancy Indexing的基础
在使用Fancy Indexing时,我们可以使用整数、布尔值或整数和布尔值的混合数组来选择数据。如下是一些基本的例子。
整数数组索引
整数数组索引允许我们按照指定的索引来选择数组中的元素。例如,如果我们有一个形状为(3,3)的数组,我们可以使用以下代码来选择特定的元素:
import numpy as np
#创建一个形状为(3,3)的数组
a = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
#选择特定的元素
indices = np.array([0, 2])
print(a[indices]) #[[0 1 2] [6 7 8]]
在这个例子中,我们创建了一个形状为(3,3)的数组,并使用整数数组[0, 2]来选择第一行和第三行的元素。
布尔数组索引
布尔数组索引用于根据布尔值数组来选择数据。在布尔数组中,True代表选中,False代表忽略。例如,如果我们有一个形状为(3,3)的数组,我们可以使用以下代码来选择元素值大于5的元素:
import numpy as np
#创建一个形状为(3,3)的数组
a = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
#返回一个布尔数组
bool_indices = a > 5
print(bool_indices) #[[False False False] [False False False] [ True True True]]
#使用布尔数组来选择元素
print(a[bool_indices]) #[6 7 8]
在这个例子中,我们创建了一个形状为(3,3)的数组,并使用布尔数组a > 5来选择元素值大于5的元素。
混合整数和布尔数组索引
我们还可以使用由整数和布尔值混合组成的数组来选择数据。这使我们能够选择与布尔值对应的索引以及与整数索引对应的值。例如,如果我们有一个形状为(3,3)的数组,我们可以使用以下代码来选择第1行、第2行和第3列的元素:
import numpy as np
#创建一个形状为(3,3)的数组
a = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
#选择第1行、第2行和第3列的元素
indices = np.array([True, True, False])
print(a[indices, [0, 1, 2]]) #[[0 1 5]]
在这个例子中,我们创建了一个形状为(3,3)的数组,并使用混合整数和布尔值的数组来选择第1行、第2行和第3列的元素。
快速的Fancy Indexing操作
除了上述基本用法外,我们还可以使用Fancy Indexing完成其他高级的数据操作,包括:
选取特定行或列的子数组
使用Fancy Indexing我们可以轻松地选择特定的行或列,并创建一个新的子数组。例如,如果我们有一个形状为(3,4)的数组,我们可以使用以下代码来选择第0行、第2行和第3列,创建一个新的子数组:
import numpy as np
#创建一个形状为(3,4)的数组
a = np.array([[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]])
#选取特定的行和列创建一个新的子数组
print(a[[0, 2], :][:, [2, 3]]) # [[2 3] [10 11]]
在这个例子中,我们选择了第0行和第2行,然后再选择第3列和第4列,最后创建了一个新的(2,2)的子数组。
修改特定行或列的值
Fancy Indexing也可以用来修改特定行或列的值。例如,如果我们有一个形状为(3,3)的数组,我们可以使用以下代码将第1行的值都设置为0:
import numpy as np
#创建一个形状为(3,3)的数组
a = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
#设置第1行的值都为0
a[1,:] = 0
print(a) #[[0 1 2] [0 0 0] [6 7 8]]
在这个例子中,我们使用Fancy Indexing来选择第1行,并将它的所有值都设置为0。
赋值操作
使用Fancy Indexing,可以将一个数组的值赋给另外一个数组。例如,如果我们有一个形状为(3,3)的数组和一个形状为(2,2)的数组,我们可以使用以下代码将第1行和第2列的值赋给新的子数组:
import numpy as np
#创建一个形状为(3,3)的数组
a = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
#创建一个形状为(2,2)的数组
b = np.array([[1, 1], [1, 1]])
#将第1行和第2列的值赋给新的子数组
a[1:3, 1:3] = b
print(a) #[[0 1 2] [3 1 1] [6 1 1]]
在这个例子中,我们使用Fancy Indexing来选择第1行和第2列,并将它们的值赋给一个形状为(2,2)的数组。
总结
Fancy Indexing是一个简单而强大的Numpy工具,它允许我们快速选择特定的行、列或元素,并执行其他高级的数据操作。使用基本的整数、布尔值或混合整数和布尔值的数组,您可以轻松地选择数据并创建新的子数组,甚至可以修改特定行或列的值。请您尝试使用Fancy Indexing完成其他高级的数据操作,以发掘Numpy的更多魅力!
极客笔记