(3)numpy数组的索引和切片操作

文章详细介绍了Python中numpy数组与列表的索引差异,包括numpy数组的单索引和高级索引特性,如列表索引重排元素、布尔列表筛选元素以及基于条件的元素选择。同时,文章也阐述了numpy数组的一维和二维切片操作,展示了其灵活性和高效性。
摘要由CSDN通过智能技术生成

在开始之前,先导入numpy第三方包:

import numpy as np

【索引】

谈到索引,我们就应该想到,在python语言中,是如何对列表进行索引的?

接下来将会对python列表索引和numpy数组索引进行比较:

# 先定义一个numpy数组
array = np.array([[1, 2, 4], [31, 2, 4]])
# 常规方法访问第一维的第一个数字“1”:
print("常规方法访问结果:", array[0][0])
# numpy数组访问第一维的第一个数组“1”:
print("numpy数组访问结果:", array[0, 0])

运行结果:

        通过代码两者之间的代码对比,我们可以很清楚的看到,在书写代码上,两者唯一的区别就是“用了几个括号?”

numpy数组这样进行索引的目的是什么?或者说,这样进行索引,会给我们带来什么便捷之处吗?

这就不得不提高numpy数组的高级索引了。

在numpy数组中,存在许多种高级索引,接下来将一一介绍:

(高级应用1):

特点:以列表形式访问元素时,将根据列表元素进行索引,所得到数组依旧是一个numpy数组:

应用途径:可以借此对列表中元素进行重新排序

arr = np.array([0, 1, 2, 3, 4])
result_things = arr[[0, 1, 2]]
print("arr第0-2的元素依次为:", result_things, result_things.dtype)

运行结果

         通过运行结果就可以得出,当传入参数是一个列表时,会根据下标索引生成一个新的numpy数组,这个数组的元素类型和原数组的元素类型一致。

(高级应用2):

特点:传入一个布尔列表,对应传入参数为True的元素,将被保留下来,重新形成一个numpy数组

bool_list = [True, False, True, True, False]
print("下标索引为0、2、3的元素依次为:", arr[bool_list])

运行结果

 True=输出

False=不输出

(高级应用3):

特点:建立在高级应用2之上,如下例代码中,求numpy数组中,大于2的元素,对numpy数组中的元素直接进行比大小操作,会返回一组由布尔值构成的numpy数组,符合要求的值,将会返回True,反之,则返回False;再将得到的(由布尔值组成)列表传入,即再应用一边高级用法2,可以得到符合要求的数组

list_return = arr > 2
print(list_return, "\n", "在数组arr中大于2的元素有:", arr[list_return])

运行结果

(综合操作):

# matrix:矩阵
int_matrix = np.random.randint(0, 10, size=(4, 3, 2))
print(int_matrix)
print("数组int_matrix中索引位置为[1][2]的元素为:", int_matrix[1, 2])
运行结果

 

【切片操作】

特点:所有的切片方式都是“左闭右开”;在进行切片操作时,无论多少维,都是使用“冒号”来表示,使用“逗号”来分割

(一维数组的切片操作):

# 一维数组的切片操作:
# 一维numpy数组的切片方式和列表完全一致,多维度时同理
arr_1 = [0, 1, 2, 3, 4, 5]
print("arr_1数组中,下标索引从0-2(不包括2)的元素为:", arr_1[0:2])

运行结果

(二维数组的切片操作):

        在对二维数组进行切片操作时,会先让其随机生成一个二维numpy数组,随后再对其进行操作。

特点:从本质上来说,二维numpy数组的切片操作,其实和C语言数组切片操作大同小异,可以带入部分思维去思考,能更好的理解。

arr_2 = np.random.randint(0, 100, size=(4, 5))
print(arr_2)
print("arr_2前两行元素为:\n", arr_2[0:2])
print("arr_2前两列元素为:\n", arr_2[:, 0:2])

运行结果

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

弦之森

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

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

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

打赏作者

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

抵扣说明:

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

余额充值