首页 > 其他分享 >【numpy基础】--数组索引

【numpy基础】--数组索引

时间:2023-07-02 16:34:19浏览次数:36  
标签:arr rows -- print cols 索引 数组 np numpy

数组索引是指在numpy数组中引用特定元素的方法。
numpy的数组索引又称为fancy indexing,比其他编程语言的索引强大很多。

1. 选取数据

numpy的索引除了像其他语言一样选择一个元素,还可以间隔着选取多个元素,也可以用任意的顺序选取元素。

比如一维数组:

arr = np.random.randint(0, 10, 5)
print(arr)
#运行结果
[7 2 6 2 1]

indexes = [0, 2, 3]
print(arr[indexes])
#运行结果
[7 6 2]

indexes = [4, 0, 2]
print(arr[indexes])
#运行结果
[1 7 6]

从上面的示例看出,通过传入 indexes 数组,可以一次选择多个元素。
indexes 数组中的值代表数组arr的下标,从0开始。

对于二维数组:

arr = np.random.randint(0, 10, (5,5))
print(arr)
#运行结果
[[5 7 3 3 2]
 [2 5 6 3 6]
 [4 1 1 0 1]
 [6 5 8 9 1]
 [2 6 5 2 0]]

rows = np.array([3, 1, 4])
cols = np.array([3, 0, 1])

print(arr[rows, cols])
#运行结果
[9 2 6]

这里 rowscols 分别代表行和列的索引,从0开始。
运行结果选取的是单个元素,分别是:arr[3, 3]arr[1, 0]arr[4, 1]

如果要从二维数组中通过选取行列,而不是选取单个元素的话:

arr = np.random.randint(0, 10, (5,5))
print(arr)
#运行结果
[[4 2 6 6 4]
 [1 8 8 1 9]
 [5 9 2 1 3]
 [8 9 1 6 9]
 [5 4 3 5 6]]

rows = np.array([3, 1, 4])
cols = np.array([3, 0, 1])

arr[rows[:, np.newaxis], cols]
#运行结果
[[6 8 9]
 [1 1 8]
 [5 5 4]]

arr[rows[:, np.newaxis], cols] 是先选取3,1,4 行,得到:

[[8 9 1 6 9]
[1 8 8 1 9]
[5 4 3 5 6]]

然后选取3,0,1 列,得到:

[[6 8 9]
[1 1 8]
[5 5 4]]

2. 与切片结合

fancy indexing可以和之前数组的切片操作相结合:

arr = np.random.randint(0, 10, (5,5))
print(arr)
#运行结果
[[4 2 6 6 4]
 [1 8 8 1 9]
 [5 9 2 1 3]
 [8 9 1 6 9]
 [5 4 3 5 6]]

rows = np.array([3, 1, 4])
cols = np.array([3, 0, 1])

#切片在行上
print(arr[:2, cols])
#运行结果
[[6 4 2]
 [1 1 8]]

#切片在列上
print(arr[rows, 1:])
#运行结果
[[9 1 6 9]
 [8 8 1 9]
 [4 3 5 6]]

arr[:2, cols] 先选择前2行,然后按照 cols 顺序选择列。
arr[rows, 1:] 按照 rows 顺序选择行,然后选择后4列。

3. 与掩码结合

fancy indexing也可以和之前介绍的掩码相结合来过滤数组:

arr = np.random.randint(0, 10, (5,5))
print(arr)
#运行结果
[[4 2 6 6 4]
 [1 8 8 1 9]
 [5 9 2 1 3]
 [8 9 1 6 9]
 [5 4 3 5 6]]

rows = np.array([3, 1, 4])
mask = np.array([True, False, False, False, True])

print(arr[rows[:, np.newaxis], mask])
#运行结果
[[8 9]
 [1 9]
 [5 6]]

arr[rows[:, np.newaxis], mask] 先按照 rows 的顺序选择行,然后用mask过滤掉 False 的列。
最后剩下的是 3,1,4 行的 第一列**最后一列**

4. 修改数据

最后,fancy indexing还有个重要的作用是修改数据,我们通过fancy indexing选取数据之后,可以直接修改它们。

arr = np.random.randint(0, 10, (5,5))
print(arr)
#运行结果
[[6 4 7 8 1]
 [0 3 5 0 6]
 [8 9 4 7 0]
 [3 0 0 9 1]
 [4 5 5 0 5]]

rows = np.array([3, 1, 4])
cols = np.array([3, 0, 1])

arr[rows, cols] = [100] * len(arr[rows, cols])
print(arr)
#运行结果
[[  6   4   7   8   1]
 [100   3   5   0   6]
 [  8   9   4   7   0]
 [  3   0   0 100   1]
 [  4 100   5   0   5]]

上面的示例中,将fancy indexing选取出的值修改为100。
注意[100] * len(arr[rows, cols]) 这个代码是根据fancy indexing选取出的元素个数来决定将几个值修改成100

5. 总结回顾

numpy数组索引的意义在于它可以使数组中的数据更加灵活和易于管理。
通过使用索引,开发人员可以快速访问数组中的特定元素,而不需要遍历整个数组。
这可以大大加快计算速度和减少内存使用。

此外,数组索引还可以用于数组的重构和维护。
通过对数组索引的有效使用,开发人员可以轻松地修改和维护数组中的数据,而不会影响到其他使用该数组的程序。

标签:arr,rows,--,print,cols,索引,数组,np,numpy
From: https://www.cnblogs.com/wang_yb/p/17520930.html

相关文章

  • LinuxDNS分析从入门到放弃(记一次有趣的dns问题排查记录,ping 源码分析,getaddrinfo源码
    PS:要转载请注明出处,本人版权所有。PS:这个只是基于《我自己》的理解,如果和你的原则及想法相冲突,请谅解,勿喷。环境说明  ubuntu18.04前言  我们这里有一块嵌入式板卡,当我们通过PING测试内网IP时,发现外网IP访问正常,但是测试域名访问一直报unknownhost。一般来说,在ubun......
  • 八期day05-java基础
    1Java环境搭建#合伙人---》下次讲#java:做反编译,发现好多java代码看不太懂,有些加密算法,也不太好破---》接下来的时候,要学习java开发 -找到加密算法---》chatgpt,让它给你写---》转成python---》自己手动调#java编译型语言 -javase:java基础---》python中变量定义,函数,......
  • 八期day06-java基础2
    零python和java字节字符串比较0.1java字节数组和字符串相互转换//1字符串转字节数组v4="彭于晏"byte[]b=v4.getBytes();//默认utf8形式System.out.println(b);//输出对象形式,看不到字节数组System.out.println(Arrays.toString(b));//try{//......
  • 多线程避免使用SimpleDateFormat及替代方案
    先来看一个多线程下使用例子,看到运行结果会出现异常:importjava.text.DateFormat;importjava.text.SimpleDateFormat;importjava.util.Date;importjava.util.Random;importjava.util.concurrent.ExecutorService;importjava.util.concurrent.Executors;publicclass......
  • LeetCode/和等于目标值的质数对
    给你一个整数n,如果两个整数x和y满足下述条件,则认为二者形成一个质数对:1<=x<=y<=nx+y==nx和y都是质数请你以二维有序列表的形式返回符合题目要求的所有[xi,yi],列表需要按xi的非递减顺序排序。如果不存在符合要求的质数对,则返回一个空数组。1.埃氏筛预......
  • SimpleDateFormat的setLenient(true或false)-----自动计算日期
    有时候我们需要判断用户的日期格式是否正确,虽然绝大多数会在前台处理,但是也有需要从文件流读入的情况,如果日期不合格就需要抛异常,这时候就需要禁止SimpleDateFormat的自动计算功能。此时就需要用到setLenient(),这个方法的含义是是否严格解析日期,具体用法如下。packagecom.test.......
  • 《基于AidLux的自动驾驶智能预警应用方案》
    基于AidLux的项目实战之智能预警在AidLux上的部署与应用1.YOLOP模型onnx转换部署YOLOP导出onnx模型执行命令:python3export_onnx.py--height640--width640执行完成后,会在weights文件夹下生成转换成功的onnx模型2.AidLux模型转换工具AlModelOptimizer通过该工具对onnx模型转......
  • 设计模式之观察者模式
    定义定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新。观察者模式的UML类图及说明如上图(图片来源于《head_first设计模式》)所示,观察者的uml中主要有以下类1.主题Subject(接口)Subject对象带有绑定观察者到Client对象和从Cl......
  • java List复制:浅拷贝与深拷贝
    Java的拷贝可以分为三种:浅拷贝(ShallowCopy)、深拷贝(DeepCopy)、延迟拷贝(LazyCopy)。在java中除了基本数据类型之外(int,long,short等),还存在引用数据类型,例如String以及对象实例。对于基本数据类型,实际上是拷贝它的值,而对于引用数据类型,拷贝的就是它的引用,并没有创建一个新的......
  • compareTo()方法
    1.返回参与比较的前后两个字符串的ASCII码的差值,如果两个字符串首字母不同,则该方法返回首字母的ASCII码的差值。Stringa1="a";Stringa2="c";System.out.println(a1.compareTo(a2));//结果为-22.参与比较的两个字符串如果首字符相同,则比较下一个字符,直到有不同的为止,......