使用 Numpy 数组:索引和切片
介绍
索引和切片是使用 Numpy 数组时需要熟悉的两个最常见的操作。当您想要使用数组的子集时,您将使用它们。本指南将带您了解多维数组上的索引和切片的世界。
索引
索引一维数组
让我们讨论一下索引一维数组。我们有一个数组array1:
import numpy as np
array1 = np.arange(0,10)
array1
输出:
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
与 Java 和 C# 等编程语言类似,索引从零开始。因此,要访问数组中的第三个元素,请使用索引 2。
array1[2]
输出:
2
索引二维数组
假设我有一个二维数组:
array1 = np.arange(12).reshape(4,3)
array1
输出:
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11]])
要访问此数组中的元素,请使用两个索引。一个用于行,另一个用于列。请注意,列和行索引均以 0 开头。因此,如果我需要访问值“10”,请使用行索引“3”和列索引“1”。
array1[3][1]
输出:
10
索引三维数组
让我们再上一层楼。要访问三维数组,还需要包含第三维的索引。三维数组可能很难想象,但让我们尽力尝试。
首先,让我创建一个三维数组:
array1 = np.arange(18).reshape(3,2,3)
array1
输出:
array([[[ 0, 1, 2],
[ 3, 4, 5]],
[[ 6, 7, 8],
[ 9, 10, 11]],
[[12, 13, 14],
[15, 16, 17]]])
请注意,这里有三个大小为 2*3 的二维数组。如果将数组重新整形为 (5,3,4) 大小,则会有五个大小为 3*4 的二维数组。
因此,要检索值“13”,首先通过指定索引“2”进入第三个二维数组。找到所需的二维数组后,即可访问所需的元素。
对于我们的情况,您需要使用索引 [2]、[0] 和 [1],其中 '0' 表示第三个二维数组中的第 0 行,'1' 表示第 1 列。
array1[2][0][1]
输出:
13
您还可以将相同的概念扩展到更高维数组。
切片
切片一维数组
要检索单个值,可以使用索引。同样,要检索值集合,可以使用切片。例如,让我定义一个一维数组
array1 = np.arange(9)
array1
输出:
array([0, 1, 2, 3, 4, 5, 6, 7, 8])
这是对数组进行切片的语法:
array1[3:6]
输出:
array([3, 4, 5])
索引 '3' 表示切片的起始元素,并且包含在内。索引 '6' 表示切片的终止元素,并且不包括在内。这就是我们在输出中没有得到值 '6' 的原因。
如果您没有指定起始和停止索引,您将获得所有值。
array1[:]
输出:
array([0, 1, 2, 3, 4, 5, 6, 7, 8])
这是因为如果索引缺失,默认情况下,Numpy 会插入选择整个数组的起始和终止索引。因此写入array1[:]相当于写入array1[0:9]
您可以扩展此概念以仅包含起始索引。在这种情况下,切片包含从起始索引到数组末尾的所有元素。例如:
array1[4:]
输出:
array([4, 5, 6, 7, 8])
或者,仅指定停止索引。
array1[:7]
输出:
array([0, 1, 2, 3, 4, 5, 6])
正如预期的那样,切片包含从数组开头到索引值的所有元素。选择起始或终止元素的规则仍然适用。
使用负索引
您还可以使用负值来获得更大的灵活性。要了解负值的工作原理,请查看下面的图片:
数组的每个元素都可以用两个索引引用。例如,“3”和“-6”都可用于检索值“40”。首先让我们声明一个具有类似值的数组:
array1 = np.array([10,20,30,40,50,60,70,80,90])
array1
输出:
array([10, 20, 30, 40, 50, 60, 70, 80, 90])
同时使用“3”和“-6”会产生相同的值。
array1[3]
输出:
40
array1[-6]
输出:
40
你也可以使用这个技巧来对数组进行切片。例如,
array1[3:-2]
输出:
array([40, 50, 60, 70])
下面是其工作原理的直观表示:
我们再试一次。这次我们对两个索引都使用负值。
array1[-3:-1]
输出:
array([70, 80])
但请注意,您无法更改索引的顺序。换句话说,切片操作不能向后移动。如果您尝试这样做,您将得到一个空数组作为输出。例如:
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~