NumPy 索引介绍

NumPyNumPyBeginner
立即练习

This tutorial is from open-source community. Access the source code

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在本实验中,我们将探索 NumPy 中的索引基础。索引使我们能够访问和操作数组中的特定元素或元素子集。了解如何有效地使用索引对于在 NumPy 中处理数组至关重要。

注意:你可以在 02-indexing-on-ndarrays.ipynb 中编写代码。步骤中省略了一些打印操作,你可以根据需要打印输出。

导入 NumPy

首先,让我们导入 NumPy 库,以便我们能够使用它的函数和数据类型。

import numpy as np

基本索引

NumPy 数组可以使用标准的 Python 语法 x[obj] 进行索引,其中 x 是数组,obj 是索引选择。根据 obj 的类型,有不同类型的索引可用。

单元素索引

单元素索引的工作方式与其他标准 Python 序列的索引完全相同。它基于 0 索引,并且接受负索引以从数组末尾开始索引。

x = np.arange(10)
print(x[2])  ## 输出: 2
print(x[-2])  ## 输出: 8

多维索引

数组可以有多个维度,并且每个维度的索引方式相同。你可以通过用逗号分隔每个维度的索引来访问多维数组中的元素。

x = np.arange(10).reshape(2, 5)
print(x[1, 3])  ## 输出: 8
print(x[1, -1])  ## 输出: 9

子维度数组索引

如果你使用比维度数更少的索引对多维数组进行索引,你将得到一个子维度数组。指定的每个索引会选择与所选其他维度相对应的数组。

x = np.arange(10).reshape(2, 5)
print(x[0])  ## 输出: [0, 1, 2, 3, 4]

切片与步长

NumPy 中的基本切片将 Python 的切片概念扩展到了 N 维。它允许你沿着数组的每个维度选择一系列元素。

基本切片

obj 是一个切片对象(由方括号内的 start:stop:step 表示法构造)、一个整数或一个由切片对象和整数组成的元组时,就会发生基本切片。

x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
print(x[1:7:2])  ## 输出: [1, 3, 5]

负索引

负索引可用于从数组末尾开始索引。例如,-1 表示最后一个元素,-2 表示倒数第二个元素,依此类推。

x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
print(x[-2:10])  ## 输出: [8, 9]
print(x[-3:3:-1])  ## 输出: [7, 6, 5, 4]

切片的默认值

如果未指定起始索引,对于正步长值,它默认为 0;对于负步长值,它默认为 -n - 1。如果未指定停止索引,对于正步长值,它默认为 n;对于负步长值,它默认为 -n - 1。如果未指定步长,它默认为 1。

x = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
print(x[5:])  ## 输出: [5, 6, 7, 8, 9]

高级索引

当选择对象 obj 是一个非元组序列对象、一个 ndarray(数据类型为整数或布尔值)或一个包含至少一个序列对象或 ndarray(数据类型为整数或布尔值)的元组时,会触发高级索引。高级索引有两种类型:整数型和布尔型。

整数数组索引

整数数组索引允许根据数组的 N 维索引选择数组中的任意项。每个整数数组表示该维度中的多个索引。

x = np.arange(10, 1, -1)
print(x[np.array([3, 3, 1, 8])])  ## 输出: [7, 7, 9, 2]
print(x[np.array([3, 3, -3, 8])])  ## 输出: [7, 7, 4, 2]

布尔数组索引

布尔数组索引允许根据布尔条件选择数组元素。结果是一个新数组,其中只包含与布尔数组中 True 值相对应的元素。

x = np.array([1., -1., -2., 3])
x[x < 0] += 20
print(x)  ## 输出: [ 1., 19., 18., 3.]

字段访问

如果 ndarray 对象是一个结构化数组,则可以像使用字典一样通过用字符串对数组进行索引来访问数组的字段。

x = np.array([(1, 2), (3, 4), (5, 6)], dtype=[('a', np.int32), ('b', np.int32)])
print(x['a'])  ## 输出: [1, 3, 5]

扁平迭代器索引

x.flat 属性返回一个迭代器,可用于以 C 连续风格遍历整个数组。这个迭代器也可以使用基本切片或高级索引进行索引。

x = np.arange(10)
iterator = x.flat
print(iterator[1:5])  ## 输出: [1, 2, 3, 4]

为索引数组赋值

你可以使用索引为数组中的特定元素或元素子集赋值。所赋的值必须与被索引数组的形状一致。

x = np.arange(10)
x[2:7] = 1
print(x)  ## 输出: [0, 1, 1, 1, 1, 1, 7, 8, 9]

x = np.arange(10)
x[2:7] = np.arange(5)
print(x)  ## 输出: [0, 1, 0, 1, 2, 3, 7, 8, 9]

总结

在本实验中,我们探索了 NumPy 中索引的基础知识。我们学习了如何使用基本索引、切片、高级索引、字段访问、扁平迭代器索引以及为索引数组赋值。理解这些索引技术对于在 NumPy 中有效地处理数组至关重要。