Numpy布尔索引和花式索引
-
布尔索引:指的是一个由布尔值组成的数组可以作为一个数组的索引,返回的数据为
True
值对应位置的值。布尔值数组长度必须和数组轴索引长度一致。#一维数组 arr1 = np.arange(5) """[0 1 2 3 4]""" bool1 = [True,False,False,True,False] arr1[bool1] array([0, 3]) #获取到下标0,3位置bool值为True的元素 #二维数组 arr2 = np.random.rand(5,4) """ [[0.46997479 0.30359067 0.55125259 0.63899705] [0.37201402 0.53077412 0.62129647 0.18914937] [0.41954877 0.68191221 0.75394428 0.18423583] [0.70372303 0.6412821 0.12537964 0.04018929] [0.56545976 0.88056762 0.08840744 0.33807558]]""" bool1 = [True,False,False,True,False] arr2[bool1] # 获取数组中下标0,3位置bool值为True的行 """ [[0.46997479 0.30359067 0.55125259 0.63899705] [0.70372303 0.6412821 0.12537964 0.04018929]] """ #布尔索引和切片组合 arr2[bool1, 2] # array([0.55125259, 0.12537964]) arr2[bool1, 1:4] """array([[0.30359067, 0.55125259, 0.63899705], [0.6412821 , 0.12537964, 0.04018929]])""" #布尔赋值 #通过逻辑运算,把满足条件的值设置为指定的值(后面会详细讲到) bool3 = arr2>0.5 arr2[bool3] = 1 """ [[0.46997479 0.30359067 1. 1. ] [0.37201402 1. 1. 0.18914937] [0.41954877 1. 1. 0.18423583] [1. 1. 0.12537964 0.04018929] [1. 1. 0.08840744 0.33807558]] """
-
花式索引:指的是用
整数数组
进行数据索引。根据索引数组的值作为目标数组的某个轴的下标来取值。对于使用一维整型数组作为索引,如果目标是一维数组,那么索引的结果就是对应位置的元素;如果目标是二维数组,那么就是对应下标的行#这里的整数数组可以是Numpy的数组,也可以是Python的列表 arr3=np.random.randint(100,size=(7,5)) arr3 """ array([[21, 29, 51, 93, 18], [16, 79, 63, 55, 40], [98, 48, 61, 27, 63], [37, 3, 48, 54, 69], [92, 78, 92, 93, 17], [36, 43, 38, 46, 25], [41, 1, 10, 56, 99]]) """ # 使用花式索引,有顺序 arr3[[0,2,5]] #获取对应下标的行 """ array([[21, 29, 51, 93, 18], [98, 48, 61, 27, 63], [36, 43, 38, 46, 25]]) """ arr3[[-2,-1]] #使用负的索引,从尾部选择 """ array([[36, 43, 38, 46, 25], [41, 1, 10, 56, 99]]) """ #多个索引数组 arr3[[0,3,5],[2,3,4]] #取出(0,2),(3,3),(5,4)元素 """ array([51, 54, 25]) """ arr3[[1,5,6,2]][:,[0,3,1,2]] """ array([[16, 55, 79, 63], [36, 46, 43, 38], [41, 56, 1, 10], [98, 27, 48, 61]]) """
花式索引和切片不一样,它总是将数据复制到一个新的数组中。!!!