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

2023-11-19

在开始之前,先导入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])

运行结果

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

(3)numpy数组的索引和切片操作 的相关文章

随机推荐