前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >numpy中的索引技巧详解

numpy中的索引技巧详解

作者头像
生信修炼手册
发布2020-06-04 11:14:17
2K0
发布2020-06-04 11:14:17
举报
文章被收录于专栏:生信修炼手册

numpy中数组的索引非常灵活且强大,基本的操作技巧有以下几种

1. 下标索引

通过每一轴的下标来访问元素,一次获取一个元素,用法如下

代码语言:javascript
复制
>>> import numpy
>>> a = numpy.arange(6)
>>> a
array([0, 1, 2, 3, 4, 5])
# 一维数组用法和python的列表对象一致
# 支持从0开始的正整数下标
# 也支持从-1开始的负整数下标
>>> a[2]
2
>>> a[-2]
4
# 二维数组,提供两个下标
>>> a = numpy.arange(9).reshape(3, -1)
>>> a
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
# 支持两种写法
# 两个中括号,第一个为行的下标,第二个为列的下标
# 一个中括号,两个下标用逗号分隔

>>> a[0][1]
1
>>> a[0, 1]
1
>>> a[0][-1]
2
>>> a[0, -1]
2

两个中括号的写法本质是分成了两步,第一步先根据第一个中括号中的下标提取对应的行,返回值为一个一维数组,第二步对第一步提取出的一维数组进行访问,因为产生了临时数组,效率会低一些。

2. 切片索引

切片索引通过切片的方式来提取子集,适用于数组内连续元素的提取,用法如下

代码语言:javascript
复制
>>> a = numpy.arange(6)
>>> a
array([0, 1, 2, 3, 4, 5])
# 一维数组用法和python的列表对象一致
>>> a[1:5]
array([1, 2, 3, 4])
>>> a[1:5:2]
array([1, 3])
>>> a[::2]
array([0, 2, 4])
# 整个数组
>>> a[::-1]
array([5, 4, 3, 2, 1, 0])
# 二维数组
>>> a = numpy.arange(9).reshape(3, -1)
>>> a
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
>>> a[1:3,1:2]
array([[4],
       [7]])
# 一个冒号的简写表示提取全部的下标
# 一个省略号的简写表示提取全部的下标
# 提取第二行
>>> a[1, :]
array([3, 4, 5])
>>> a[1, ...]
array([3, 4, 5])
# 提取第二列
>>> a[:, 1]
array([1, 4, 7])

二维数组的切片不能用两个中括号的写法,因为切片的返回值和原始数组维度相同,第一步切片提取出来之后任然是二维数组

代码语言:javascript
复制
>>> a = numpy.arange(9).reshape(3, -1)
>>> a
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
>>> a[1:3]
array([[3, 4, 5],
       [6, 7, 8]])

3. 花式索引

花式索引,本质是根据下标的集合,即索引数组来提取子集,与切片的区别在于,花式索引可以提取非连续的元素,用法如下

代码语言:javascript
复制
>>> a = numpy.arange(6)
>>> a
array([0, 1, 2, 3, 4, 5])
>>> a[[1, 2, 5]]
array([1, 2, 5])
# 返回值总是和索引数组的维度相同
>>> a[numpy.array([(0, 1, 3),(1, 4, 5)])]
array([[0, 1, 3],
       [1, 4, 5]])
>>> a = numpy.arange(9).reshape(3, -1)
>>> a
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
# 根据索引数组中的下标提取对应的行
>>> a[[1, 0]]
array([[3, 4, 5],
       [0, 1, 2]])
# 一轴为索引数组,另一轴为下标索引
>>> a[[0,2],1]
array([1, 7])
# 两个轴同时为索引数组,需要使用ix_函数
# 第一个数组中的元素为行对应的下标
# 第一个数组中的元素为列对应的下标
>>> a[numpy.ix_([0,1], [0,1])]
array([[0, 1],
       [3, 4]])

需要注意,利用花式索引从二维数组中提取当行或者单列的数据,会统一返回一维数组,这和切片不同,因为切片只是在原来的数组上生成新视图,而花式索引总是生成一个新的数组。

4. 布尔索引

布尔索引本质是根据一个布尔数组来提取子集,用法如下

代码语言:javascript
复制
>>> a = numpy.arange(6)
>>> a
array([0, 1, 2, 3, 4, 5])
# 一维数组
>>> a > 3
array([False, False, False, False,  True,  True], dtype=bool)
>>> a[a > 3]
array([4, 5])
>>> a = numpy.arange(9).reshape(3, -1)
>>> a
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
# 二维数组
>>> a > 3
array([[False, False, False],
       [False,  True,  True],
       [ True,  True,  True]], dtype=bool)
>>> a[a > 3]
array([4, 5, 6, 7, 8])

布尔索引的返回值也是一个新的数组,所以也要注意返回值的维度问题。

·end·

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信修炼手册 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档