返回介绍

第23单元 索引和切片

发布于 2024-01-28 22:01:16 字数 1856 浏览 0 评论 0 收藏 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文