在Numpy中,访问或修改数组中的元素,可以采用索引或切片的方式。

基本切片

slice()构造切片对象

Numpy内置函数slice()可以用来构造切片对象,通过它可以实现从原数组上切割出一个新的数组

  1. np.slice(start, stop, step)
  1. import numpy as np
  2. a = np.arange(10)
  3. #生成切片对象
  4. s = slice(2,9,3) # 从索引2开始到索引9停止,间隔时间为2
  5. print(a[s]) # [2 5 8],输出方法:从区间数组中填入slice对象

冒号切片

冒号切片方法与Python中的冒号切片相同

一维数组切片

  1. import numpy as np
  2. a = np.arange(10)
  3. b = a[2:9:3]
  4. print(b) # [2 5 8]

多维数组切片

"..."省略号如果在行位置使用,表示返回所有行元素;如果在列位置使用,表示返回所有列元素

  1. import numpy as np
  2. #创建二维数组a
  3. a = np.array([[1,2,3],[3,4,5],[4,5,6]])
  4. #返回数组的第二列
  5. print (a[...,1])
  6. #返回数组的第二行
  7. print (a[1,...])
  8. #返回第二列后的所有项
  9. print (a[...,1:])

高级索引

整数数组索引

高级索引返回的是数组的副本(深拷贝),而切片操作返回的是数组视图(浅拷贝)。

  • 列表的方式填充下标。 ```python a = b[rows, cols]

其中: rows与cols按顺序组合构成多个索引。

  1. ```python
  2. # 一维数组示例
  3. import numpy as np
  4. a = np.array([1, 2, 3, 4, 5])
  5. b = a[[0, 1, 2]]
  6. print(b) # [1 2 3]
  7. # 多维数组示例1
  8. import numpy as np
  9. x = np.array([[1, 2], [3, 4], [5, 6]])
  10. #[0,1,2]代表行索引;[0,1,0]代表列索引
  11. y = x[[0,1,2],[0,1,0]] # 行索引与列索引按顺序组合构成索引
  12. print (y) # [1 4 5]
  13. # 多维数组示例2
  14. # 多维数组示例2
  15. import numpy as np
  16. b = np.array([[0, 1, 2],
  17. [3, 4, 5],
  18. [6, 7, 8],
  19. [9, 10, 11]])
  20. r = np.array([[0, 0], [3, 3]]) # 以数组的方式建立行索引
  21. c = np.array([[0, 2], [0, 2]]) # 以数组的方式建立列索引
  22. # 获取四个角的元素
  23. c = b[r, c] # 可先简化为单一的数组元素,如a进行理解,最后再单独拆解即可
  24. print(c) # [[ 0 2] [ 9 11]]

:...符与整数数组结合使用

  1. import numpy as np
  2. d = np.array([[0, 1, 2],
  3. [3, 4, 5],
  4. [6, 7, 8],
  5. [9, 10, 11]])
  6. # 对行列分别进行切片
  7. e = d[1:4, 1:3]
  8. print(e)
  9. # 行使用基础索引,对列使用高级索引
  10. f = d[1:4, [1, 2]] # [1,2]代表的是列索引,因此可以一维的整数数组索引解析
  11. # 显示切片后结果
  12. print(f)
  13. # 对行使用省略号
  14. h = d[..., 1:]
  15. print(h)

布尔数组索引

输出的结果需要进行布尔运算时,需要使用布尔数组索引。

  • 下标的方式填充布尔运算条件即可。 ```python

    返回所有大于6的数字组成的数组

    import numpy as np

x = np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]]) print (x[x > 6]) # [7 8 9 10 11]返回的是一维数组

使用补码运算符(~)除去 NaN 数据

import numpy as np

a = np.array([np.nan, 1,2,np.nan,3,4,5]) print(a[~np.isnan(a)) # [ 1. 2. 3. 4. 5.]

删除复数中的整数

import numpy as np

a = np.array([1, 2+6j, 5, 3.5+5j]) print( a[np.iscomplex(a)]) # [2.0+6.j 3.5+5.j]

  1. <a name="OjJCC"></a>
  2. ## 花式索引(拓展知识)
  3. **花式索引与整数数组索引类似**,但在**多个索引数组中,略有不同**。
  4. ```python
  5. import numpy as np
  6. x=np.arange(32).reshape((8,4))
  7. print (x[np.ix_([1,5,7,2],[0,3,1,2])]) # 需要添加np.ix_符表示花式索引
  8. # 输出结果如下:(与整数数组索引的按顺序行列组合不同,其列索引直接进行了对应排序)
  9. """
  10. [[ 4 7 5 6]
  11. [20 23 21 22]
  12. [28 31 29 30]
  13. [ 8 11 9 10]]
  14. """