python numpy 索引_详解numpy高级索引

如果一个ndarray是非元组序列,数据类型为整数或布尔值的ndarray,或者至少一个元素为序列对象的元组,我们就能够用它来索引ndarray。高级索引始终返回数据的副本。 与此相反,切片只提供了一个视图。

整数索引

例1

索引的第一个列表提供行号,第二个列表提供列号,获取了数组中(0,0),(1,1)和(2,0)位置处的元素。>>>import numpy as np

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

[[1 2]

[3 4]

[5 6]]

>>>y = x[[0, 1, 2], [0, 1, 0]]

[1 4 5]

例2

rows提供两个行索引,cols提供两个列索引,分别获取了y中的两个列表>>>import numpy as np

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

[[ 0 1 2 3]

[ 4 5 6 7]

[ 8 9 10 11]

[12 13 14 15]]

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

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

>>>y = x[rows, cols]

[[ 1 6]

[11 15]]

例3

组合使用切片和...

切片相当于组合的for循环,与单纯的数组并不一样,但如果组合使用时,数组可以看作是切片,但是都是数组和使用切片的效果不同(b、c、d以及例2)

...相当于是:>>>import numpy as np

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

[[1 2 3]

[4 5 6]

[7 8 9]]

>>>b = a[1:3, 1:3]

[[5 6]

[8 9]]

>>>c = a[1:3, [1, 2]]

[[5 6]

[8 9]]

>>>d = a[[1, 2], [1, 2]]

[5 9]

>>>e = a[..., 1:]

[[2 3]

[5 6]

[8 9]]

>>>f = a[:, 1:]

[[2 3]

[5 6]

[8 9]]

例4

对于使用一维整型数组作为索引,如果目标是一维数组,那么索引的结果就是对应位置的元素;如果目标是二维数组,那么就是对应下标的行>>>import numpy as np

>>>x=np.arange(32).reshape((8,4))

[[ 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]]

[[16 17 18 19]

[ 8 9 10 11]

[ 4 5 6 7]

[28 29 30 31]]

>>>x[[-4,-2,-1,-7]]

[[16 17 18 19]

[24 25 26 27]

[28 29 30 31]

[ 4 5 6 7]]

例5

使用np.ix_传入多个索引数组,行列交点索引,有些类似与切片>>>import numpy as np

>>>x=np.arange(32).reshape((8,4))

[[ 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[np.ix_([1,5,7,2],[0,3,1,2])]

[[ 4 7 5 6]

[20 23 21 22]

[28 31 29 30]

[ 8 11 9 10]]

布尔索引

例1

我们可以通过一个布尔数组来索引目标数组。

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

下例获取大于 5 的元素:>>>import numpy as np

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

[[ 0 1 2]

[ 3 4 5]

[ 6 7 8]

[ 9 10 11]]

>>>x[x > 5]

[ 6 7 8 9 10 11]

例2

同样可以使用~运算符,过滤掉nan>>>import numpy as np

>>>a = np.array([np.nan, 1, 2, np.nan, 3, 4, 5])

[nan 1. 2. nan 3. 4. 5.]

>>>a[~np.isnan(a)]

[1. 2. 3. 4. 5.]

例3

过滤掉非复数>>>import numpy as np

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

[1. +0.j 2. +6.j 5. +0.j 3.5+5.j]

>>>a[np.iscomplex(a)]

[2. +6.j 3.5+5.j]

你可能感兴趣的:(python,numpy,索引)