numpy数据索引与切片


numpy切片和索引

类似于list切片和索引一样,ndarray对象也可以通过索引或切片进行操作。

  • ndarray 数组可以基于 0 - n 的下标进行索引
  • 两种切片方式:①通过内置的 slice(start, stop, step) 函数;②通过冒号分隔切片参数 start:stop:step

以下展示了两种不同切片方式

arr = np.arange(10)
# 从索引 2 开始到索引 7 停止,间隔为2
arr1 = arr[slice(2,7,2)]
arr2 = arr[2:7:2]
print('arr1:{0}\narr2:{1}'.format(arr1,arr2))
arr1:[2 4 6]
arr2:[2 4 6]

一、冒号 : 切片

numpy中出上文中介绍的切片方式外,可以通过操作对数组进行任意方式的切片,十分的灵活。

  • 如果只放置一个参数,如 [2],将返回与该索引相对应的单个元素
  • 如果为 [2:],表示从该索引开始以后的所有项都将被提取
  • 如果使用了两个参数,如 [2:7],那么则提取两个索引(不包括停止索引)之间的项
  • 索引为负数表示倒序,如[-1]则表示最后一项

1. 正向切片

arr = np.arange(10) #[0 1 2 3 4 5 6 7 8 9]
arr1 = arr[3] #第4个元素
print('arr1:{0}'.format(arr1))
arr2 = arr[2:] #从第3个往后的元素
print('arr2:{0}'.format(arr2))
arr3 = arr[2:6] #第3个至第7个元素
print('arr3:{0}'.format(arr3))
arr1:3
arr2:[2 3 4 5 6 7 8 9]
arr3:[2 3 4 5]

可以使用省略号 可以选择与数组的维度相同的数据,该方法与使用作用相同

arr = np.arange(12) .reshape(3,4) ## array([[ 0,  1,  2,  3], [ 4,  5,  6,  7], [ 8,  9, 10, 11]])
print(arr[...,1]) # 第2列元素
print(arr[...,1]==arr[:,1])
print(arr[1,...])   # 第2行元素
print(arr[1,...]==arr[1,:])
print(arr[...,1:])  # 第2列及剩下的所有元素
print(arr[...,1:]==arr[:,1:])
 [1 5 9]
 [ True  True  True]
 [4 5 6 7]
 [ True  True  True  True]
 [[ 1  2  3]
  [ 5  6  7]
  [ 9 10 11]]
 [[ True  True  True]
  [ True  True  True]
  [ True  True  True]]

2. 负向切片

介绍[-1]、[:-1]、[::-1]、[2::-1]表达的意义

arr = np.arange(10) #array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
print(arr[-1]) ## 最后一个元素: 9
print(arr[-3]) ## 从后面数第3个元素:7
print(arr[:-1])  ## 截止到最后一个数:[0 1 2 3 4 5 6 7 8]
print(arr[:-3])  ## 截止到最后3个数:[0 1 2 3 4 5 6]
print(arr[::-1]) ## 对数组进行倒序:[9 8 7 6 5 4 3 2 1 0]
print(arr[2::-1]) ## 取从下标为2的元素翻转读取:[2 1 0]

::前面的值为初始取数的下标,后面的值为步长,正负符号表示正向和反向

print(arr[5::2])  ## 从下标为5的数,往后每隔2个导出:[5 7 9]
print(arr[5::-3])  ##从下标为5的数,从后往前每隔3个数: [5 2]
print(arr[::-3]) ## 从后往前每隔3个数: [9 6 3 0]

二、高级索引

1. 整数数组索引

根据行索引和列索引取数

arr = np.arange(12) .reshape(4,3) ##array([[ 0,  1,  2],[ 3,  4,  5],[ 6,  7,  8],[ 9, 10, 11]])
##获取数组中(0,2),(1,1),(3,2)和(2,2)位置处的元素
arr1 = arr[[0,1,3,2],[2,1,2,2]] ##array([ 2,  4, 11,  8])
##行索引是 [0,0] 和 [3,3],而列索引是 [0,2] 和 [0,2],得到的是一个二维数组
rows = np.array([[0,0],[3,3]]) 
cols = np.array([[0,2],[0,2]]) 
arr2 = arr[rows,cols] #array([[ 0,  2], [ 9, 11]])
##分别对行列进行分割
arr3 = arr[1:3, 1:3] #array([[4, 5], [7, 8]]),
arr4 = arr[:,[1,2]] # array([[ 1,  2], [ 4,  5], [ 7,  8], [10, 11]]))

2. 布尔索引

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

arr = np.arange(12) .reshape(4,3) ##array([[ 0,  1,  2],[ 3,  4,  5],[ 6,  7,  8],[ 9, 10, 11]])
##计算arr中大于5的数
print(arr>5) ## [[False False False] [False False False] [ True  True  True] [ True  True  True]]
print(arr[arr>5]) ## [ 6  7  8  9 10 11]
##计算arr中不等于5的数
print(arr[arr!=5]) ## [ 0  1  2  3  4  6  7  8  9 10 11]

3. 花式索引

花式索引指的是利用整数数组进行索引
根据索引数组的值作为目标数组的某个轴的下标来取值。

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

花式索引跟切片不一样,它总是将数据复制到新数组中

arr = np.arange(20).reshape((5,4))#[[ 0,  1,  2,  3],[ 4,  5,  6,  7],[ 8,  9, 10, 11],[12, 13, 14, 15],[16, 17, 18, 19]]
## 从0行计,取第4,2,1行
arr1 = arr[[4,2,1]] ##[[16, 17, 18, 19],[ 8,  9, 10, 11],[ 4,  5,  6,  7]]
## 倒序,最后一行序号-1,依次取第-4,-2,-1行
arr2 = arr[[-4,-2,-1]] ##[[ 4,  5,  6,  7], [12, 13, 14, 15], [16, 17, 18, 19]]

传入多个索引数组,需要使用np.ix_
np.ix_函数,能把两个一维数组转换为一个用于选取方形区域的索引器,先按第一个数组序号选取行,再选取第二个数组中对应的列

arr3 = arr[[1,2,3],[2,1,1]] # [ 6,  9, 13]
idx = np.ix_([1,2,3],[2,1,3]) #array([[1],[2],[3]]), array([[2, 1, 3]])
arr4 = arr[idx] # [[ 6,  5,  7], [10,  9, 11], [14, 13, 15]]
  • 5
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值