如果一个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]