索引:获取数组中特定位置元素的过程

切片:获取数组元素子集的过程

利用切片得到的数组为浅复制,即原数组改变,新的数组也会随之改变。为避免浅复制,建议使用副本切片,即copy()

import numpy as np

一维数组

一维数组的索引和切片与python中的列表类似

索引:若元素个数为n,则索引下标可表示为[0,1,2,...,n-1]或[-n,-(n-1),-(n-2),...,-2,-1]

  1. print('*'*8+'一维数组的索引和切片'+'*'*8)
  2. # 若元素个数为n,则索引下标可表示为[0,1,2,...,n-1]或[-n,-(n-1),-(n-2),...,-2,-1]
  3. ar1 = np.array([5, 6, 7, 8, 9])
  4. print(ar1[4]) # 索引自左向右从下标0开始
  5. print(ar1[-2]) # 索引自右向左从下标-1递减,最右边为-1,相邻的为-2

切片:切片可用三元素冒号分割

ar1[起始编号 : 终止编号(不含) : 步长],起始编号默认是0,终止编号默认是n,步长默认是1

仍然是ndarray数组
  1. b = ar1[1:4:2]
  2. print(b)
  3. print(type(b))

多维数组

  1. ar2 = np.arange(24).reshape((2, 3, 4))
  2. print('*'*8+'多维数组的索引和切片'+'*'*8)

多维数组的索引,每个维度一个索引值,逗号分隔————r2[ax0上索引,ax1上索引,ax2上索引],各个维度索引和一维相同0~n-1-n~-1

  1. print(ar2)
  2. print(ar2[1, 1, 2])
  3. print(ar2[-1, -2, -2])

多维数组的切片,逗号分隔,每个维度同一维切片一样,用三冒号分隔, 如果只有一个:表示选取整个维度

  1. print(ar2[:, 1:3, :])
  2. print(ar2[:, 1:3, ::2])
  3. print(ar2[:, 1, -3])

索引数组:将数组作为索引,通常是一维数组(每个元素代表对应维度索引)

1.布尔索引

布尔数组:顾名思义,元素类型为布尔值的数组,同样可以是一维或者多维数组

例如:bool_arr1 = np.array([True, False, False, False, False, False,True])

如下的数组定义也是布尔数组

  1. names = np.array(['Liu', 'Zhang', 'Li', 'Wang', 'Sun', 'Zong', 'Kong'])
  2. bool_arr2 = names == 'Zhang'

此时bool_arr2array[False True False False False False False]

若想得到bool_arr1,则:bool_arr1 = (names == 'Liu') | (names == 'Kong')

同样的,与 &非 ~不等于 !=>=<=><等条件判断同样可以用于布尔数组赋值语句里。

注意!Python中的关键字andor对布尔值数组并没有用,is在特殊情况可能会有效,即判断两个布尔数组是否相等

如:bool_arr3 = ~(names == 'Zhang')等价于boo_arr3 = names != 'Zhang'

一维布尔数组 作为 布尔索引数组,例如:

  1. names = np.array(['Liu', 'Zhang', 'Li', 'Wang', 'Sun', 'Zong', 'Kong'])
  2. bool_arr2 = names == 'Zhang'
  3. data = np.arange(21).reshape((7,3))
  4. print(data)
  5. print(data[bool_arr2])

输出为:

  1. [[ 0 1 2]
  2. [[ 0 1 2]
  3. [ 3 4 5]
  4. [ 6 7 8]
  5. [ 9 10 11]
  6. [12 13 14]
  7. [15 16 17]
  8. [18 19 20]] # data
  9. [[3 4 5]] # data[bool_arr2]

2.神奇索引

使用整数数组作为数据索引数组,整数数组可以是一维或多维

2.1一维数据索引数组

一维数据索引数组传递包含指定顺序的列表或数组。即:

一维数据索引数据每个元素i代表数组轴axis=0上,即取第1维的第i个数据。

例1:

  1. data1 = np.arange(28).reshape((7, 4))
  2. print(data1)
  3. print('-'*20 + 'data1[[1, 5, 6, 2, 1]]' + '-'*20)
  4. print(data1[[1, 5, 6, 2, 1]])
  5. print('-'*20 + 'data1[[-1, 3, -2, -5, 1]]' + '-'*20)
  6. print(data1[[-1, 3, -2, -5, 1]])

输出为:

  1. [[ 0 1 2 3] # 0或-7
  2. [ 4 5 6 7] # 1或-6
  3. [ 8 9 10 11] # 2或-5
  4. [12 13 14 15] # 3或-4
  5. [16 17 18 19] # 4或-3
  6. [20 21 22 23] # 5或-2
  7. [24 25 26 27]] # 6或-1
  8. --------------------data1[[1, 5, 6, 2, 1]]--------------------
  9. [[ 4 5 6 7]
  10. [20 21 22 23]
  11. [24 25 26 27]
  12. [ 8 9 10 11]
  13. [ 4 5 6 7]]
  14. --------------------data1[[-1, 3, -2, -5, 1]]--------------------
  15. [[24 25 26 27]
  16. [12 13 14 15]
  17. [20 21 22 23]
  18. [ 8 9 10 11]
  19. [ 4 5 6 7]]

例2:

  1. data2 = np.arange(48).reshape((4, 4, 3))
  2. print(data2)
  3. print('-'*20 + 'data2[[3, 0, 2, 1, 0]]' + '-'*20)
  4. print(data2[[3, 0, 2, 1, 0]])
  5. print('-'*20 + 'data2[[-1, -2, 1, 2]]' + '-'*20)
  6. print(data2[[-1, -2, 1, 2]])

输出为:

  1. [[[ 0 1 2]
  2. [ 3 4 5]
  3. [ 6 7 8]
  4. [ 9 10 11]] # 0或-4
  5. [[12 13 14]
  6. [15 16 17]
  7. [18 19 20]
  8. [21 22 23]] # 1或-3
  9. [[24 25 26]
  10. [27 28 29]
  11. [30 31 32]
  12. [33 34 35]] # 2或-2
  13. [[36 37 38]
  14. [39 40 41]
  15. [42 43 44]
  16. [45 46 47]]] # 3或-1
  17. --------------------data2[[3, 0, 2, 1, 0]]--------------------
  18. [[[36 37 38]
  19. [39 40 41]
  20. [42 43 44]
  21. [45 46 47]]
  22. [[ 0 1 2]
  23. [ 3 4 5]
  24. [ 6 7 8]
  25. [ 9 10 11]]
  26. [[24 25 26]
  27. [27 28 29]
  28. [30 31 32]
  29. [33 34 35]]
  30. [[12 13 14]
  31. [15 16 17]
  32. [18 19 20]
  33. [21 22 23]]
  34. [[ 0 1 2]
  35. [ 3 4 5]
  36. [ 6 7 8]
  37. [ 9 10 11]]]
  38. --------------------data2[[-1, -2, 1, 2]]--------------------
  39. [[[36 37 38]
  40. [39 40 41]
  41. [42 43 44]
  42. [45 46 47]]
  43. [[24 25 26]
  44. [27 28 29]
  45. [30 31 32]
  46. [33 34 35]]
  47. [[12 13 14]
  48. [15 16 17]
  49. [18 19 20]
  50. [21 22 23]]
  51. [[24 25 26]
  52. [27 28 29]
  53. [30 31 32]
  54. [33 34 35]]]

data2是多维数组,其在轴axis=0共有4个数据,每个数据其实又是一个数组

2.2 多个索引数组

传递多个索引数组作为索引时,会根据每个索引数组对应元素选出一个一维数组

每个索引数组大小应相同,设为n数组个数应等于数据数组的维数,相当于得到n个点的坐标,坐标分量即为数据数组对应维度。

例:

  1. data3 = np.arange(32).reshape((8, 4))
  2. print(data3)
  3. print('-'*20 + 'data3[[1, 5, 7, 2], [0, 3, 1, 2]]' + '-'*20)
  4. print(data3[[1, 5, 7, 2], [0, 3, 1, 2]])
  5. data4 = np.arange(48).reshape((4, 4, 3))
  6. print('-'*20 + 'data4' + '-'*40)
  7. print(data4)
  8. print('-'*20 + 'ddata4[[3, 3, 1, 2, 0], [2, 1, 2, 0, 3], [2, 2, 0, 2, 1]' + '-'*20)
  9. print(data4[[3, 3, 1, 2, 0], [2, 1, 2, 0, 3], [2, 2, 0, 2, 1]])

输出为:

  1. 0 1 2 3 # “坐标”
  2. 0[[ 0 1 2 3]
  3. 1 [ 4 5 6 7]
  4. 2 [ 8 9 10 11]
  5. 3 [12 13 14 15]
  6. 4 [16 17 18 19]
  7. 5 [20 21 22 23]
  8. 6 [24 25 26 27]
  9. 7 [28 29 30 31]]
  10. --------------------data3[[1, 5, 7, 2], [0, 3, 1, 2]]--------------------
  11. [ 4 23 29 10]
  12. --------------------data4----------------------------------------
  13. [[[ 0 1 2]
  14. [ 3 4 5] # 0(axis=0)
  15. [ 6 7 8]
  16. [ 9 10 11]]
  17. [[12 13 14]
  18. [15 16 17] # 1
  19. [18 19 20]
  20. [21 22 23]]
  21. [[24 25 26]
  22. [27 28 29] # 2
  23. [30 31 32]
  24. [33 34 35]]
  25. [[36 37 38]
  26. [39 40 41] # 3
  27. [42 43 44]
  28. [45 46 47]]]
  29. --------------------ddata4[[3, 3, 1, 2, 0], [2, 1, 2, 0, 3], [2, 2, 0, 2, 1]--------------------
  30. [44 41 18 26 10]

data3[[1, 5, 7, 2], [0, 3, 1, 2]] 即为“坐标“(1,0)、(5,3)、(7,1)、(2,2)的元素被选中。

data4是一个三维数组,在0轴上,又是一个二维数组,同理:

data4[[3, 3, 1, 2, 0], [2, 1, 2, 0, 3], [2, 2, 0, 2, 1]]即为坐标(3,2,2)、(3,1,2)、(1,2,0)、(2,0,2)、(0,3,1)的元素

2.3神奇索引发挥类似切片功能

切片是逗号分隔,在每一维上可用一维数据索引数组作为其索引

多个索引数组其实就是一种特殊的切片,每维索引都是一个一维数据索引

例:

  1. data3 = np.arange(32).reshape((8, 4))
  2. print(data3)
  3. kols = data3[[1, 5, 7, 2]]
  4. print('-'*20 + 'kols' + '-'*20)
  5. print(kols)
  6. print('-'*20 + 'data3[[1, 5, 7, 2]][:, [0, 3, 1, 2, 3]]' + '-'*20)
  7. print(data3[[1, 5, 7, 2]][:, [0, 3, 1, 2, 3]])

输出为:

  1. [[ 0 1 2 3]
  2. [ 4 5 6 7]
  3. [ 8 9 10 11]
  4. [12 13 14 15]
  5. [16 17 18 19]
  6. [20 21 22 23]
  7. [24 25 26 27]
  8. [28 29 30 31]]
  9. --------------------kols--------------------
  10. [[ 4 5 6 7]
  11. [20 21 22 23]
  12. [28 29 30 31]
  13. [ 8 9 10 11]]
  14. --------------------data3[[1, 5, 7, 2]][:, [0, 3, 1, 2, 3]]--------------------
  15. [[ 4 7 5 6 7]
  16. [20 23 21 22 23]
  17. [28 31 29 30 31]
  18. [ 8 11 9 10 11]]

data3[[1, 5, 7, 2]][:, [0, 3, 1, 2]]其实就是data3[[1, 5, 7, 2]],即kols的切片,切片第一维取全部,即全部行。

第二维取一维数据数组[0,3,1,2]即:

新数组第一列为kols第一列(0)[4 20 28 8]

第二列为kols第4列(3)[7 23 31 11]

第三列为kols第2列(1)[5 21 29 9]

第四列为kols第3列(2)[6 22 30 10]

第五列为kols第4列(3)[7 23 31 11]

numpy.newaxis关键字

numpy.axis用来增加数组新维度,如数组a.shape=(d0,d1,...,dn),那么在其di-1和di中间添加np.newaxis,即第i轴增加newaxis,那么a.shape\(\rightarrow\)(d0,d1,..di-1,1,di,..,dn)

例:

  1. a = np.arange(24).reshape((2, 3, 4))
  2. print("数组a:\n", a)
  3. b = a[:, np.newaxis, :, :]
  4. print("数组b:\n", b)

输出:

  1. 数组a:
  2. [[[ 0 1 2 3]
  3. [ 4 5 6 7]
  4. [ 8 9 10 11]]
  5. [[12 13 14 15]
  6. [16 17 18 19]
  7. [20 21 22 23]]]
  8. 数组b:
  9. [[[[ 0 1 2 3]
  10. [ 4 5 6 7]
  11. [ 8 9 10 11]]]
  12. [[[12 13 14 15]
  13. [16 17 18 19]
  14. [20 21 22 23]]]]
  15. b.shape = (2, 1, 3, 4)

我们经常在取数组一列或一行时,得到一个一维数组,但我们仍然希望是二维数组形式,则可以使用numpy.newaxis关键字。

ndarray数组的索引和切片的更多相关文章

  1. 3.3Python数据处理篇之Numpy系列(三)---数组的索引与切片

    目录 (一)数组的索引与切片 1.说明: 2.实例: (二)多维数组的索引与切片 1.说明: 2.实例: 目录: 1.一维数组的索引与切片 2.多维数组的索引与切片 (一)数组的索引与切片 1.说明: ...

  2. numpy数组的索引和切片

    numpy数组的索引和切片 基本切片操作 >>> import numpy as np >>> arr=np.arange(10) >>> arr ...

  3. Numpy学习二:数组的索引与切片

    1.一维数组索引与切片#创建一维数组arr1d = np.arange(10)print(arr1d) 结果:[0 1 2 3 4 5 6 7 8 9] #数组的索引从0开始,通过索引获取第三个元素a ...

  4. Numpy 索引及切片

    1.一维数组的索引及切片 ar = np.arange(20) print(ar) print(ar[4]) print(ar[3:6]) print(ar[:4:2]) #索引到4 按2的步长 pr ...

  5. 利用Python进行数据分析(5) NumPy基础: ndarray索引和切片

    概念理解 索引即通过一个无符号整数值获取数组里的值. 切片即对数组里某个片段的描述. 一维数组 一维数组的索引 一维数组的索引和Python列表的功能类似: 一维数组的切片 一维数组的切片语法格式为a ...

  6. 窥探Swift之数组安全索引与数组切片

    今天是元宵节,祝大家元宵节快乐!在Swift中的数组和字典中下标是非常常见的,数组可以通过索引下标进行元素的查询,字典可以通过键下标来获取相应的值.在使用数组时,一个常见的致命错误就是数组越界.如果在 ...

  7. numpy之索引和切片

    索引和切片 一维数组 一维数组很简单,基本和列表一致. 它们的区别在于数组切片是原始数组视图(这就意味着,如果做任何修改,原始都会跟着更改). 这也意味着,如果不想更改原始数组,我们需要进行显式的复制 ...

  8. Numpy:索引与切片

    numpy基本的索引和切片 import numpy as np arr = np.array([1,2,3,555,666,888,10]) arr array([ 1, 2, 3, 555, 66 ...

  9. Python开发:NumPy学习(一)ndarray数组

    一.数据维度 一个数据表达一个含义,一组数据表达一个或多个含义. 数据维度概念:一组数据的组织形式,其中有一维数据.二维数据.多维数据.高维数据. 1.  一维数据 一维数据由对等关系的有序或无序数据 ...

随机推荐

  1. ubuntu19.10——snap错误has install-snap change in progress

    使用软件商店安装时遇到问题 snap has install-snap change in progress 原因是之前的安装错误终止,使得现在的安装无法进行,解决方案: 终端输入: snap cha ...

  2. 阿里云zabbix的python脚本

    由于阿里云只能用465端口.所以这个zabbix的脚本修改成了465端口的python脚本. 修改于https://www.jianshu.com/p/9d6941dabb47 #!/usr/bin/ ...

  3. mybatis 自定义类型转换器 (后台日期类型插入数据库)

    后台日期类型插入数据库 有以下几种发法: 1 调用数据库 日期字符串转日期函数 str_to_date("日期","yyyy-MM-dd HH:mm:ss") ...

  4. Python 语言基础

    Python 语言基础 Python 开发环境 计算机组成 编程语言(计算机语言)是人们为了控制计算机,而设计的一种符号和文字的组合,从而实现向计算机发出指令. 形式是符号和文字的组合 目的是为了控制 ...

  5. 量化投资_TB交易开拓者A函数和Q函数详解

    //////////////////A函数详解/////////////// //A函数主要在端口上进行下单操作//////////////// A_AccountID说明 返回当前公式应用的交易帐户 ...

  6. iTOP4412开发板-使用buildroot搭建最简单的linux

    本文档介绍的是使用buildroot搭建最简单的linux文件系统,Buildroot是Linux平台上一个构建嵌入式Linux系统的框架.整个Buildroot是由Makefile脚本和Kconfi ...

  7. VMware 三种网络配置解释

    https://blog.csdn.net/noob_f/article/details/51099040 ifconfig -a 网卡名称

  8. 依赖注入&控制反转

    IoC——Inversion of Control  控制反转DI——Dependency Injection   依赖注入 要想理解上面两个概念,就必须搞清楚如下的问题: 参与者都有谁? 依赖:谁依 ...

  9. 基于STC89C516的多游戏实现

    所用器件:STC89C516,矩阵键盘,LCD1602,16*16点阵,74HC595,无源蜂鸣器,晶振为11.0592MHZ 使用说明: 开机(复位)进入启动界面,1602显示Welcome.500 ...

  10. TCP与UDP 笔记

    本文整理自:<图解TCP/IP 第5版>作者:[日] 竹下隆史,[日] 村山公保,[日] 荒井透,[日] 苅田幸雄 著译者:乌尼日其其格出版时间:2013-07 TCP提供可靠的通信传输, ...