专栏首页AI派Numpy 修炼之道 (5)—— 索引和切片

Numpy 修炼之道 (5)—— 索引和切片

推荐阅读时间:7min~10min 文章内容:Numpy 索引和切片

上一篇:Numpy 修炼之道 (4)—— 基本运算操作

Python 中原生的数组就支持使用方括号([])进行索引和切片操作,Numpy 自然不会放过这个强大的特性。

单个元素索引

1-D数组的单元素索引是人们期望的。它的工作原理与其他标准Python序列一样。它是从0开始的,并且接受负索引来从数组的结尾进行索引。

>>> x = np.arange(10)
>>> x[2]
2
>>> x[-2]
8

与Python原生的列表、元组不同的是,Numpy数组支持多维数组的多维索引。

>>> x.resize(2,5)
>>> x
array([[0, 1, 2, 3, 4],
       [5, 6, 7, 8, 9]])
>>> x[1,3]
8
>>> x[1,-1]
9
>>> x[1][-1]
9

x[1,-1] 的结果等于 x[1][-1],但是第二种情况效率更低,因为第二种方式创建了一个临时数组。

切片支持

可以使用切片和步长来截取不同长度的数组,使用方式与Python原生的对列表和元组的方式相同。

>>> x[2:5]
array([2, 3, 4])
>>> x[:-7]
array([0, 1, 2])
>>> x[1:7:2]
array([1, 3, 5])
>>> y = np.arange(35).reshape(5,7)
>>> y[1:5:2,::3]
array([[ 7, 10, 13],
       [21, 24, 27]])

注意:使用切片不会复制内部数组数据,但也会生成原始数据的新视图。

索引数组

Numpy数组可以被其他数组索引。对于索引数组的所有情况,返回的是原始数据的副本,而不是一个获取切片的视图。

索引数组必须是整数类型。

>>> x = np.arange(10,1,-1)
>>> x
array([10,  9,  8,  7,  6,  5,  4,  3,  2])
>>> x[np.array([3, 3, 1, 8])]
array([7, 7, 9, 2])

使用索引数组来对被索引数组进行索引后,会生成一个与索引数组形状相同的新数组,只是这个新数组的值会用被索引数组中对应索引的值替代。

x[np.array([3, 3, 1, 8])]

布尔索引数组

使用(整数)索引列表时,需要提供要选择的索引列表,最后生成的结果形状与索引数组形状相同;但是在使用布尔索引时,布尔数组必须与要编制索引的数组的初始维度具有相同的形状。在最直接的情况下,布尔数组具有相同的形状:

>>> y
array([[ 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]])
>>> b = y > 20
>>> y[b]
array([21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34])

与整数索引数组的情况不同,在布尔数组中,结果是1-D数组,其包含索引数组中的所有元素,对应于布尔数组中的所有真实元素。索引数组中的元素始终以行优先(C样式)顺序进行迭代和返回。结果也与y[np.nonzero(b)]相同。与索引数组一样,返回的是数据的副本,而不是一个获取切片的视图。

如果y比b的维数更高,则结果将是多维的。例如:

>>> b[:,5] # use a 1-D boolean whose first dim agrees with the first dim of y
array([False, False, False,  True,  True], dtype=bool)
>>> y[b[:,5]]
array([[21, 22, 23, 24, 25, 26, 27],
       [28, 29, 30, 31, 32, 33, 34]])

这里,从索引数组中选择第4和第5行,并组合以形成2-D数字组。

结构化索引工具

为了便于数组形状与表达式和赋值关系的匹配,可以在数组索引中使用np.newaxis对象来添加大小为1的新维。例如:

>>> y.shape
(5L, 7L)
>>> y[:,np.newaxis,:].shape
(5L, 1L, 7L)

注意,在数组中没有新的元素,只是维度增加。这可以方便地以一种方式组合两个数组,否则将需要明确重塑操作。例如:

>>> x = np.arange(5)
>>> x
array([0, 1, 2, 3, 4])
>>> x[:,np.newaxis] + x[np.newaxis,:]
array([[0, 1, 2, 3, 4],
       [1, 2, 3, 4, 5],
       [2, 3, 4, 5, 6],
       [3, 4, 5, 6, 7],
       [4, 5, 6, 7, 8]])

省略语法(三个点)可以用于指示完全选择任何剩余的未指定维度。如果数组z的形状是(3,3,3,3),那么z[1,...,2]等效于z[1,:,:,2]。例如:

>>> z = np.arange(81).reshape(3,3,3,3)
>>> z[1,...,2]
array([[29, 32, 35],
       [38, 41, 44],
       [47, 50, 53]])
>>> z[1,:,:,2]
array([[29, 32, 35],
       [38, 41, 44],
       [47, 50, 53]])

给被索引的数组赋值

可以使用单个索引,切片,索引和布尔数组来选择数组的子集来分配。分配给索引数组的值必须是形状一致的(相同的形状或可广播到索引产生的形状)。例如,允许为切片分配常量:

>>> x = np.arange(10)
>>> x[2:7] = 1

或正确大小的数组:

>>> x[2:7] = np.arange(5)

相关推荐:

Numpy 修炼之道(1) —— 什么是 Numpy

Numpy 修炼之道 (2)—— N维数组 ndarray

Numpy 修炼之道 (3)—— 数据类型

Numpy 修炼之道 (4)—— 基本运算操作

作者:无邪,个人博客:脑洞大开,专注于机器学习研究。

本文分享自微信公众号 - 脑洞科技栈(naodong-open),作者:1or0

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-03-02

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 520来了,如何用 Python 预测女神是否属于自己呢

    很明显,在 520 这一天,Python 已经告诉你说“她不是你的了”,说真的,做程序猿确实辛苦,“朝九晚五”跟我们没有半毛钱关系。

    abs_zero
  • 今天免的高速费,以后都会让你交回来

    遵循往年惯例,今年国庆黄金周期间,收费公路对小型客车免费。政策利好刺激下,车流、人流井喷式暴增,高速拥堵与景区爆棚已经可以预见。

    abs_zero
  • 划重点! TensorFlow 2.0 中的符号和命令式 API

    文 / Josh Gordon, Google Developer Advocate

    abs_zero
  • Python+pandas一维数组常用操作

    Series是pandas提供的一维数组结构,由索引和值两部分组成,可以包含不同类型的值,如果在创建时没有明确指定索引则会自动使用从0开始的非负整数作为索引。

    Python小屋屋主
  • 你认识的“索引”那些事儿

    其实提到索引这个名词,有些抽象我们不太好理解这个名词。你转换下思路和学习方法。你会发现其实生活中的索引无处不在。

    程序源代码
  • 企业面试题|最常问的MySQL面试题集合(一)

    问题1:char、varchar的区别是什么? varchar是变长而char的长度是固定的。如果你的内容是固定大小的,你会得到更好的性能。

    民工哥
  • MySQL索引实现

    我们上一篇讲了MySQL索引背后的数据结构及算法原理,我们知道了为什么使用索引查询数据效率那么高的原理了,我们接着看看MySQL的索引是如何实现的。

    互扯程序
  • SQL Server 深入解析索引存储(下)

    概述 非聚集索引与聚集索引具有相同的 B 树结构,它们之间的显著差别在于以下两点: 基础表的数据行不按非聚集键的顺序排序和存储。 非聚集索引的叶层是由索引...

    逸鹏
  • MySQL索引实现原理分析

    目前大部分数据库系统及文件系统都采用 B-Tree(B 树)或其变种 B+Tree(B+树)作为索引结构。B+Tree 是数据库系统实现索引的首选数据结构。

    desperate633
  • 学习数据库必会知识点-索引-以及索引的巧妙用法

    MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。

    Java编程指南

扫码关注云+社区

领取腾讯云代金券