《玩转Numpy计算库》视频课程
《玩转Numpy计算库》视频课程链接:https://edu.csdn.net/course/detail/28656
索引和切片 (Indexing and Slicing)
赋值和访问数组的元素类似于Python的其他序列数据类型,如列表和元组。 Numpy还有很多索引选择,类似于列表和元组的索引。
假设你熟悉Python的列表和元组的切片。 对于一维数组,其语法在numpy中是相同的,但它也可以应用于多个维度。
一维数组A的一般语法如下所示:
A[start:stop:step]
下面用一些例子说明“切片”的工作原理。 从最简单的情况开始,即切片一维数组:
F = np.array([1, 2, 2, 3, 5, 8, 13, 21])
# print the first element of F
print(F[0])
# print the last element of F
print(F[-1])
1
21
data = np.array([1, 2, 3])
print(data[1])
print(data[0:2])
print(data[1:])
print(data[-2:])
2
[1 2]
[2 3]
[2 3]
注意:在列表和元组上的切片会创建新对象,但对数组执行切片操作会在原始数组上创建一个视图(view)。 如果我们修改一个视图,原始数组也将被修改。
A = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
S = A[2:6]
print(S)
[2 3 4 5]
S[0] = 22
S[1] = 23
print(A)
[ 0 1 22 23 4 5 6 7 8 9]
使用列表执行类似的操作,可以看到我们得到了一个拷贝(副本):
lst = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
lst2 = lst[2:6]
lst2[0] = 22
lst2[1] = 23
print(lst)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
索引多维数组:
A = np.array([ [3.4, 8.7, 9.9],
[1.1, -7.8, -0.7],
[4.1, 12.3, 4.8]])
print(A[1][0])
1.1
我们访问了第二行中的元素,即索引为1的行和索引为0的第1列。
上面访问多维数组的方式可能非常低效。 原因是我们创建了一个中间数组A[1],从中访问索引为0的元素。所以它的行为类似于:
tmp = A[1]
print(tmp)
print(tmp[0])
[ 1.1 -7.8 -0.7]
1.1
在Numpy中还有另一种访问多维数组元素的方法:只使用一对方括号,所有索引都用逗号分隔:
print(A[1, 0])
1.1
在处理矩阵时,索引和切片操作非常有用:
data = np.array([[1, 2], [3, 4],[5,6]])
data
array([[1, 2],
[3, 4],
[5, 6]])
data[0, 1]
2
data[1:3]
array([[3, 4],
[5, 6]])
data[0:2, 0]
array([1, 3])
a = np.arange(40).reshape(5, 8)
print(a)
[[ 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]
[32 33 34 35 36 37 38 39]]
a[2, -3]
21
a[:3, :5]
array([[ 0, 1, 2, 3, 4],
[ 8, 9, 10, 11, 12],
[16, 17, 18, 19, 20]])
a[-3:, -3:]
array([[21, 22, 23],
[29, 30, 31],
[37, 38, 39]])
a[:, 3]
array([ 3, 11, 19, 27, 35])
a[1, 3:6]
array([11, 12, 13])
a[1::2, ::3]
array([[ 8, 11, 14],
[24, 27, 30]])
如果选择元组中的对象数目小于维N,则对于任何后续维度的假定是’:’。例如
A = np.array(
[ [ [45, 12, 4], [45, 13, 5], [46, 12, 6] ],
[ [46, 14, 4], [45, 14, 5], [46, 11, 5] ],
[ [47, 13, 2], [48, 15, 5], [52, 15, 1] ] ])
A[1:3, 0:2] # equivalent to A[1:3, 0:2, :]
array([[[46, 14, 4],
[45, 14, 5]],
[[47, 13, 2],
[48, 15, 5]]])