Numpy中的高级索引
NumPy 比一般的 Python 序列提供更多的索引方式。除了基本的用整数和切片的索引外,数组可以由**整数数组索引**、**布尔索引**及**花式索引**。
整数数组索引
(一)一维数组的索引
import numpy as np
x = np.array([[1, 2], [3, 4], [5, 6]])
print("原数组为:")
print(x)
#行索引为[0,1,2],列索引为[0,1,0]
y = x[[0,1,2], [0,1,0]]
#x[[0,1,2], [0,1,0]]等价于:取出x中(0,0),(1,1),(2,0)位置的元素
#索引数组为[[0,0],[1,1],[2,0]]
print ("索引结果:")
print (y)
原数组为:
[[1 2]
[3 4]
[5 6]]
索引结果:
[1 4 5]
以上实例获取数组中(0,0),(1,1)和(2,0)位置处的元素。
(二)二维数组的索引
import numpy as np
x = np.array([[0,1,2],[3,4,5],[6,7,8],[9,10,11]])
print ("原数组为:")
print (x)
#行索引为[[0,0],[3,3]],列索引为[[0,2],[0,2]]
rows = np.array([[0,0],[3,3]])
cols = np.array([[0,2],[0,2]])
y = x[rows,cols]
#索引数组为[[0,0],[0,2],
# [3,0],[3,2]]
print ("索引结果:")
print (y)
原数组为:
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
索引结果:
[[ 0 2]
[ 9 11]]
(三)切片索引
import numpy as np
a = np.array([[1,2,3], [4,5,6],[7,8,9]])
b = a[1:3, 1:3]
print("切片索引:")
print(b)
c = a[1:3,[1,2]]
print("切片索引+列表列索引:")
print(c)
d = a[...,1:]
print("...索引:")
print(d)
切片索引:
[[5 6]
[8 9]]
切片索引+列表列索引:
[[5 6]
[8 9]]
…索引:
[[2 3]
[5 6]
[8 9]]
布尔索引
我们可以通过一个布尔数组来索引目标数组。
布尔索引通过布尔运算(如:比较运算符)来获取符合指定条件的元素的数组。
以下实例获取大于 5 的元素:
import numpy as np
x = np.array([[0,1,2],[3,4,5],[6,7,8],[9,10,11]])
print ("原数组为:")
print (x)
# 现在我们会打印出大于 5 的元素
print("布尔索引结果:")
print(x[x>5])
原数组为:
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
布尔索引结果:
[ 6 7 8 9 10 11]
选去数组中不等于0的元素:
import numpy as np
x = np.array([0,1,2,0,3,4,0,5])
print (x[x!=0])
[1 2 3 4 5]
(一)一维数组的索引
布尔数组中,下标为0,3,4的位置是True,因此将会取出目标数组中对应位置的元素。
import numpy as np
x=np.arange(7)
print ("原数组为:")
print (x)
boolean= np.array([True,False,False,True,True,False,False])
print("索引结果:")
print(x[boolean])
原数组为:
[0 1 2 3 4 5 6]
索引结果:
[0 3 4]
(二)二维数组的索引
布尔数组中,下标为0,3,4的位置是True,因此将会取出目标数组中第0,3,4行。
import numpy as np
x=np.arange(28).reshape((7,4))
print ("原数组为:")
print (x)
boolean=np.array([True,False,False,True,True,False,False])
#布尔数组的维度要与原数组的维度相同
print("索引结果:")
print(x[boolean])
原数组为:
[[ 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]]
索引结果:
[[ 0 1 2 3]
[12 13 14 15]
[16 17 18 19]]
花式索引
花式索引指的是利用整数数组进行索引。
花式索引根据索引数组的值作为目标数组的某个轴的下标来取值。对于使用一维整型数组作为索引,如果目标是一维数组,那么索引的结果就是对应位置的元素;如果目标是二维数组,那么就是对应下标的行。
花式索引跟切片不一样,它总是将数据复制到新数组中。
(一)一维数组的花式索引
import numpy as np
x=np.array(['0','1','2','3','4'])
print ("原数组为:")
print (x)
print("索引结果:")
print(x[[1,4]])
原数组为:
[‘0’ ‘1’ ‘2’ ‘3’ ‘4’]
索引结果:
[‘1’ ‘4’]
(二)二维数组的花式索引
import numpy as np
x=np.empty((8,4),dtype=np.int)
for i in range(8):
x[i]=i
print ("原数组为:")
print (x)
print("索引结果1:")
print(x[[4,3,0,6]])
print("索引结果2:")
print(x[[-3,-5,-7]])
原数组为:
[[0 0 0 0]
[1 1 1 1]
[2 2 2 2]
[3 3 3 3]
[4 4 4 4]
[5 5 5 5]
[6 6 6 6]
[7 7 7 7]]
索引结果1:
[[4 4 4 4]
[3 3 3 3]
[0 0 0 0]
[6 6 6 6]]
索引结果2:
[[5 5 5 5]
[3 3 3 3]
[1 1 1 1]]
对于使用两个整型数组作为索引的时候,那么结果是按照顺序取出对应轴的对应下标的值。特别注意,这两个整型数组的shape应该一致,或者其中一个数组应该是长度为1的一维数组(与NumPy的Broadcasting机制于关系)。例如,以[1,3,5],[2,4,6]这两个整型数组作为索引,那么对于二维数组,则取出(1,2),(3,4),(5,6)这些坐标对应的元素。
x=np.arange(42).reshape(6,7)
print ("原数组为:")
print (x)
print("索引结果:")
print(x[[1,3,5],[2,4,6]])
原数组为:
[[ 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 32 33 34]
[35 36 37 38 39 40 41]]
索引结果:
[ 9 25 41]
结果与整数数组索引的相同
传入多个索引数组(要使用np.ix_)
import numpy as np
x=np.arange(32).reshape((8,4))
#np.ix_()里扔进两个一维数组[1,5,7,2],[0,3,1,2],就能先按我们要求选取行,再按顺序将列排序
print (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]]
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!