8. Numpy的索引和切片 (Indexing and Slicing)

《玩转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]]])
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bai666ai

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值