7-Python-NumPy切片和索引

2020-10-16  本文已影响0人  千千罐
1、通过内置的 \color{red}{slice} 函数进行切片
>>> import numpy as np
>>> a = np.arange(10)
>>> s = slice(2,7,2)                 # 从索引 2 开始到索引 7 停止,间隔为2
>>> a[s]
array([2, 4, 6])

>>> np.arange(10)[slice(2,7,2)]
array([2, 4, 6])
2、直接通过 \color{red}{:} 进行切片,用法同Python对List的操作,这里不再重复

一维数组

>>> a = np.arange(10) 
>>> a
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
>>> a[2:7:2]
array([2, 4, 6])

多维数组

>>> b = np.array([[1,2,3],[3,4,5],[4,5,6]])
>>> b
array([[1, 2, 3],
       [3, 4, 5],
       [4, 5, 6]])
>>> b[1]
array([3, 4, 5])
3、多维数组 还可以 使用 \color{red}{...} 来进行切片

... 代表行或列的全部元素

>>> b = np.array([[1,2,3],[3,4,5],[4,5,6]])
array([[1, 2, 3],
       [3, 4, 5],
       [4, 5, 6]])

''' 第二列 '''
>>> b[...,1]
array([2, 4, 5])

''' 第二行 '''
>>> b[1,...]
array([3, 4, 5])

''' 所有行的第二列至最后一列元素'''
>>> b[...,1:]
array([[2, 3],
       [4, 5],
       [5, 6]])

''' [...,...]是不可取的 '''
>>> b[...,...]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: an index can only have a single ellipsis ('...')
4、高级索引
4.1、整数数组索引

先要确定需要获取的元素的索引,将行索引和列索引分别组合在一起即可

获取数组中(0,0),(1,1)和(2,0)位置处的元素,那行就应该是[0,1,2],列是[0,1,0]

>>> x = np.array([[1,  2],  [3,  4],  [5,  6]])
>>> x
array([[1, 2],
       [3, 4],
       [5, 6]])
>>> x[[0,1,2],  [0,1,0]]  
array([1, 4, 5])

单独获取行和列,再合并

>>> x = np.array([[  0,  1,  2],[  3,  4,  5],[  6,  7,  8],[  9,  10,  11]])  
>>> x
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11]])

>>> rows = np.array([[0,0],[3,3]]) 
>>> rows
array([[0, 0],
       [3, 3]])

>>> cols = np.array([[0,2],[0,2]]) 
>>> cols
array([[0, 2],
       [0, 2]])

>>> x[rows,cols]  
array([[ 0,  2],
       [ 9, 11]])

借助切片 : 或 … 与索引数组组合

>>> a = np.array([[1,2,3], [4,5,6],[7,8,9]])
>>> a
array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])

>>> a[1:3, 1:3]
array([[5, 6],
       [8, 9]])

>>> a[1:3,[1,2]]
array([[5, 6],
       [8, 9]])
4.2、布尔索引

通过布尔运算(如:比较运算符)来获取符合指定条件的元素的数组

保留大于5的元素

>>> a = np.array([[  0,  1,  2],[  3,  4,  5],[  6,  7,  8],[  9,  10,  11]])  
>>> a
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11]])
>>> a[a > 5 ]
array([ 6,  7,  8,  9, 10, 11])

去掉NaN元素

''' 一维数组 '''
a = np.array([np.nan,1,2,np.nan,3,4,5])  
>>> a
array([nan,  1.,  2., nan,  3.,  4.,  5.])
>>> a[~np.isnan(a)]
array([1., 2., 3., 4., 5.])

''' 二维数组 '''
>>> a = np.array([[np.nan,1,2],[np.nan,4,5]])  
>>> a
array([[nan,  1.,  2.],
       [nan,  4.,  5.]])
>>> a[~np.isnan(a)]
array([1., 2., 4., 5.])

保留值复数的元素

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

结果会生成一个满足比较条件后的元素组成的一维数组

4.3、花式索引

根据索引数组的值作为目标数组的某个轴的下标来取值。对于使用一维整型数组作为索引,如果目标是一维数组,那么索引的结果就是对应位置的元素;如果目标是二维数组,那么就是对应下标的行

提取数组的第4,2,1,7行,结果会生成一个4行列数和原数组相同的数组。

>>> x=np.arange(32).reshape((8,4))
>>> x
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15],
       [16, 17, 18, 19],
       [20, 21, 22, 23],
       [24, 25, 26, 27],
       [28, 29, 30, 31]])
>>> x[[4,2,1,7]]
array([[16, 17, 18, 19],
       [ 8,  9, 10, 11],
       [ 4,  5,  6,  7],
       [28, 29, 30, 31]])

也可以进行倒叙取值

>>> x[[-4,-2,-1,-7]]
array([[16, 17, 18, 19],
       [24, 25, 26, 27],
       [28, 29, 30, 31],
       [ 4,  5,  6,  7]])

行和列同时取值

>>> x[np.ix_([1,5,7,2],[0,3,1,2])]
array([[ 4,  7,  5,  6],
       [20, 23, 21, 22],
       [28, 31, 29, 30],
       [ 8, 11,  9, 10]])
>>> x[np.ix_([1,5,7,2],[0,3,1,])]
array([[ 4,  7,  5],
       [20, 23, 21],
       [28, 31, 29],
       [ 8, 11,  9]])

转:https://www.runoob.com/numpy/numpy-advanced-indexing.html

上一篇下一篇

猜你喜欢

热点阅读