Numpy 奇怪索引方式
Numpy是Python中一个十分重要的用于数值计算的库,它提供了大量简便的操作方法,但是有些操作方式与其他Python库略有不同,给初学者带来了一点困扰。下面介绍一些与Numpy奇怪索引相关的问题。
阅读更多:Numpy 教程
布尔索引
在对Numpy数组进行索引时,我们可以使用布尔数组进行索引遮掩(boolean array indexing)。例如:
输出结果为:
在这个例子中,我们通过创建一个长度与数组arr相同的布尔掩码来选取数组中的元素。此处,掩码mask中为True的位置对应arr中同样位置的元素会被选出。掩码mask也可以由某些条件得到,例如:
这样我们就可以通过掩码mask来选取中的元素了。布尔索引既可以用于选取单个数组中的元素,也可以用于选取多个数组中的元素。例如:
输出结果为:
在这个例子中,我们首先通过掩码mask来选取两个数组中elementwise对应位置上的元素,再分别对每个数组进行操作。
整数索引
与布尔索引类似,整数索引也可以用于选取数组中对应位置的元素。相比之下,整数索引可以用于同时选取多个元素,或者选取某些从数组结构上不能由其他方法访问到的元素。例如:
输出结果为:
在这个例子中,数组indices包含整数1和3,这样就可以根据他们在数组arr中的位置来选取所对应的两个元素。另外,需要注意的是,整数索引会生成一个新的数组,因此对选取结果进行修改并不会影响到原来的数组:
输出结果为:
在这个例子中,我们对通过整数索引选取的子数组subset进行了修改,但是并没有修改原来的数组arr。
花式索引
花式索引是指通过列表或者数组进行索引的方法,在Numpy中这种方法也叫作“数组索引”、“非元素数组索引”或“整数数组索引”。相比之下,花式索引与上面介绍的其他索引方式不同,因为它所选取的元素不是基于某些掩码或者整数的位置,而是基于某些索引列表或者数组的内容。例如:
输出结果为:
在这个例子中,我们通过一个包含三个整数的列表来选取数组arr中对应位置的元素。另外,花式索引和其他索引方式相比有以下几个不同之处:
- 花式索引可以用于选取多个数组中的元素,例如:
输出结果为:
- 花式索引可以用于同时选取多个元素,例如:
输出结果为:
在这个例子中,我们通过两个列表row_indices和col_indices分别指定所选取元素的行和列,将两个列表分别放在数组索引中,并使用逗号将它们分隔开来。
- 花式索引返回的是一个新的数组,因此对选取结果的修改并不会影响到原来的数组,例如:
输出结果为:
多维索引
在Numpy中,除了通过上面所介绍的掩码、整数、花式索引进行一维数组的索引,我们还可以通过它们的组合来进行多维数组的索引。例如:
输出结果为:
在这个例子中,我们通过掩码和整数索引的组合来选取二维数组arr中的元素,其中掩码mask所选择的是第1和第3行,而整数索引indices所选择的则是第1列和第2列。因此,选取的元素分别是arr[0, 1]和arr[2, 1]。
除了可以使用多个整数或者掩码,我们还可以使用多维的几个数组来进行索引,例如:
输出结果为:
在这个例子中,我们使用了两个二维数组来进行索引,其中掩码mask和整数索引indices所选取的元素分别是[1, 0], [2, 1], 和[1, 1],对应的在数组arr中的元素是1, 4, 和6。
数组转置和索引
在Numpy中,有些奇怪的索引方式还与数组的转置有关。数组转置可以通过将数组的行和列的顺序交换来得到,例如:
输出结果为:
在这个例子中,我们通过将arr的行和列的顺序互换来得到转置矩阵,由于数组是二维的,所以转置矩阵也是二维的。另外,需要注意的是,不同维度的数组转置方式略有不同,例如三维数组的转置:
输出结果为:
在这里,我们通过传入一个由元组表示的轴顺序来对数组进行转置,例如(1, 0, 2)表示将第1个轴和第0个轴交换位置,然后保持第2个轴不变。
另外,需要注意的是,转置矩阵同样可以通过索引进行操作。例如:
输出结果为:
在这个例子中,我们通过转置矩阵transpose的索引来对其进行操作,例如[1, 0]表示获取transpose的第2列和第1列,并将其置于新的转置矩阵的第1行和第0行。