第23单元 索引和切片
numpy数组支持同Python列表一致的索引[i]和切片[i:j]操作。此外,数组还能实现布尔索引:可以使用布尔值数组作为索引,其结果是原始数组中布尔索引为True的项构成的数组。通常,布尔数组是广播的结果。布尔索引既可以在右侧(用于选择),也可以在左侧(用于分配)。
假设我们从数据提供者处得知,脏数据集中的所有数据都是非负数。这就意味着任何负数都不是真实值,而是错误值,必须将其替换为更有意义的数(比如零),这样的操作被称为数据清洗。由此可见,要清除脏数据,首先需要找出有问题的值,然后运用合理的替代方式替换它们。
dirty = np.array([9, 4, 1, -0.01, -0.02, -0.001]) whos_dirty = dirty < 0 # 这是一个布尔数组,可以作为布尔索引来使用 ➾ array([False, False, False, True, True, True], dtype=bool) dirty[whos_dirty] = 0 # 将所有的负值设置为0 ➾ array([9, 4, 1, 0, 0, 0])
可以将多个布尔表达式与以下运算符组合使用:|(逻辑或)、&(逻辑与)以及-(逻辑非)。如果想知道以下列表中哪些项目介于-0.5和0.5之间,直接“问”numpy吧!
linear = np.arange(-1, 1.1, 0.2) (linear <= 0.5) & (linear >= -0.5) ➾ array([False, False, False, True, True, True, True, True, False, ➾ False, False], dtype=bool)
两种布尔运算
关系运算符(例如<和==)的优先级低于位运算符&、|和!,它们是作用在numpy数组上的“布尔”运算符。这常常令人感到困惑,因为“正常的”Python布尔运算符(or、and和not)的优先级是比关系运算符还低的。为了确保numpy数组的布尔运算能首先运行,必须将其包含在括号中。
numpy数组的另一个很酷的特性是“智能”索引和“智能”切片,其中索引不是一个标量,而是一个数组或索引列表。其结果是索引对应的项组成的数组。下面我们从之前建立的S&P列表中选出第二个、第三个和最后一个股票代码(这就是所谓的“智能”索引)。
sap[[1, 2, -1]] ➾ array(['ABT', 'BBV', 'ADT'], ➾ dtype='<U4')
有时候你可能会想:为什么不从重构的数组中提取中间列的所有行呢?(这就是所谓的“智能”切片。)有如下两种实现方法:
sap2d[:, [1]] ➾ array([['ABT'], ➾ ['ATVI']], ➾ dtype='<U4') sap2d[:, 1] ➾ array(['ABT', 'ATVI'], ➾ dtype='<U4')
Python针对一个问题会提供多种相似的工具,这是极好的,但是一定要小心不要选错工具。仔细对比前面挑选出的两个数组可以发现,第一个是二维矩阵,而第二个是一维数组。结合你的需求,肯定只能选择其中之一。因此,在刚开始使用Python时,有必要检查一下结果,确保它真的就是你想要的。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论