NumPy 教程

NumPy 首页 NumPy 简介 NumPy 环境

数组

NumPy Ndarray 对象 NumPy 数据类型

创建和操作数组

NumPy 数组创建例程 NumPy 数组操作 NumPy 基于现有数据创建数组 NumPy 基于数值范围创建数组 NumPy 数组迭代 NumPy 重塑数组 NumPy 连接数组 NumPy 堆叠数组 NumPy 拆分数组 NumPy 展平数组 NumPy 转置数组

索引与切片

NumPy 索引 &切片 NumPy 索引 NumPy 切片 NumPy 高级索引 NumPy 高级索引 NumPy 字段访问 NumPy 使用布尔数组切片

数组属性与操作

NumPy 数组属性 NumPy 数组形状 NumPy 数组大小 NumPy 数组步长 NumPy 数组元素大小 NumPy 广播 NumPy 算术运算 NumPy 数组加法 NumPy 数组减法 NumPy 数组乘法 NumPy 数组除法

高级数组运算

NumPy 交换数组的轴 NumPy 字节交换 NumPy 副本和视图 NumPy 逐元素数组比较 NumPy 过滤数组 NumPy 连接数组 NumPy 排序、搜索& 计数函数 NumPy 搜索数组 NumPy 数组并集 NumPy 查找唯一行 NumPy 创建日期时间数组 NumPy 二元运算符 NumPy 字符串函数 NumPy 矩阵库 NumPy 线性代数 NumPy Matplotlib NumPy 使用 Matplotlib 绘制直方图

排序和高级操作

NumPy 数组排序 NumPy 沿轴排序 NumPy 使用花式索引进行排序 NumPy 结构化数组 NumPy 创建结构化数组 NumPy 操作结构化数组 NumPy 记录数组 NumPy 加载数组 NumPy 保存数组 NumPy 将值附加到数组 NumPy 交换列数组 NumPy 将轴插入数组

处理缺失数据

NumPy 处理缺失数据 NumPy 识别缺失值 NumPy 移除缺失数据 NumPy 插补缺失值数据

性能优化

NumPy 使用数组进行性能优化

线性代数

NumPy 线性代数 NumPy 矩阵库 NumPy 矩阵加法 NumPy 矩阵减法 NumPy 矩阵乘法 NumPy 逐元素矩阵运算 NumPy 点积 NumPy 矩阵求逆 NumPy 行列式计算 NumPy 特征值 NumPy 特征向量 NumPy 奇异值分解 NumPy 求解线性方程 NumPy 矩阵范数

元素级矩阵运算

NumPy 总和 NumPy 平均值 NumPy 中位数 NumPy 最小值 NumPy 最大值

集合运算

NumPy 唯一元素 NumPy 交集 NumPy 并集 NumPy 差集

随机数生成

NumPy 随机数生成器 NumPy 排列和重排 NumPy 均匀分布 NumPy 正态分布 NumPy 二项分布 NumPy 泊松分布 NumPy 指数分布 NumPy 瑞利分布 NumPy 逻辑分布 NumPy 帕累托分布 NumPy 使用 Seaborn 可视化分布 NumPy 多项分布 NumPy 卡方分布 NumPy Zipf 分布

文件输入 &输出

NumPy 使用 NumPy 进行 I/O NumPy 从文件读取数据 NumPy 将数据写入文件 NumPy 支持的文件格式

数学函数

NumPy 数学函数 NumPy 三角函数 NumPy 指数函数 NumPy 对数函数 NumPy 双曲函数 NumPy 舍入函数

傅里叶变换

NumPy 离散傅里叶变换 (DFT) NumPy 快速傅里叶变换 (FFT) NumPy 逆傅里叶变换 NumPy 傅里叶级数和变换 NumPy 信号处理应用 NumPy 卷积

多项式

NumPy 多项式表示 NumPy 多项式运算 NumPy 求多项式的根 NumPy 求多项式的根

统计

NumPy 统计函数 NumPy 描述性统计

日期时间函数

NumPy 日期和时间基础知识 NumPy 表示日期和时间 NumPy 日期和时间运算 NumPy 使用日期时间进行索引 NumPy 时区处理 NumPy 时间序列分析 NumPy 处理时间增量 NumPy 闰秒处理 NumPy 矢量化日期时间运算

ufunc

NumPy ufunc 简介 NumPy 创建通用函数 (ufunc) NumPy 算术通用函数 (ufunc) NumPy 小数舍入 ufunc NumPy 对数通用函数(ufunc) NumPy 求和通用函数 (ufunc) NumPy 乘积通用函数 (ufunc) NumPy 差分通用函数 (ufunc) NumPy 寻找最小公倍数 (LCM) NumPy 寻找最大公约数 (GCD) NumPy 三角函数 (ufunc) NumPy 双曲线 (ufunc) NumPy 集合运算(ufunc)

实用资源

NumPy 快速指南 NumPy 备忘单


NumPy - 数组迭代

NumPy 中的数组迭代

NumPy 中的数组迭代是指以系统的方式逐个访问数组中每个元素的过程。这通常使用循环来完成。迭代用于对每个元素执行操作,例如计算、修改或检查。

NumPy 提供了几种迭代数组的方法 -

  • 使用 for 循环
  • 使用 'nditer()' 迭代器对象
  • 平面迭代
  • 迭代顺序
  • 控制迭代顺序
  • 广播迭代
  • 使用向量化操作
  • 外部循环
  • 修改数组值

使用 for 循环

在 NumPy 中,您可以使用基本的 Python for 循环 来迭代数组。 for 循环是一种用于迭代序列(例如列表、元组、字典、集合或字符串)的控制流语句。它允许您对序列中的每个元素重复执行一段代码。

迭代一维数组

一维数组本质上是一个元素列表。对其进行迭代很简单,类似于对常规 Python 列表进行迭代。

示例

在下面的示例中,我们根据元素列表创建一个 NumPy 数组,并使用 for 循环对每个元素进行迭代 -

import numpy as np

# 创建一个一维 NumPy 数组
arr = np.array([1, 2, 3, 4, 5])

# 迭代数组
for element in arr:
    print(element)

以下是得到的输出 -

1
2
3
4
5

迭代多维数组

NumPy 数组可以有任意数量的维度,通常称为轴。例如 -

  • 一维数组是元素的列表。
  • 二维数组就像一个有行和列的矩阵。
  • 三维数组可以可视化为二维矩阵的集合。

示例:迭代二维数组

迭代二维数组时,每次迭代都会访问数组的一整行,如下例所示 -

import numpy as np

# 创建二维 NumPy 数组(3x3 矩阵)
arr_2d = np.array([[1, 2, 3],
                   [4, 5, 6],
                   [7, 8, 9]])

# 迭代数组
for row in arr_2d:
    print(row)

这将产生以下结果 -

[1 2 3]
[4 5 6]
[7 8 9]

示例:迭代三维数组

迭代三维数组时,每次迭代都会访问一个完整的二维子数组(矩阵),如下例所示 -

import numpy as np

# 创建一个三维 NumPy 数组 (2x2x3)
arr_3d = np.array([[[1, 2, 3],
                    [4, 5, 6]],
                   [[7, 8, 9],
                    [10, 11, 12]]])

# 迭代数组
for matrix in arr_3d:
    print(matrix)

以下是上述代码的输出 -

[[1 2 3]
[4 5 6]]
[[ 7 8 9]
[10 11 12]]

迭代多维数组中的元素

在 NumPy 中,迭代多维数组中的元素是一种访问每个单独元素的方法,无论数组的维度是多少。此过程需要嵌套循环来遍历数组结构的每个维度。

示例

在此示例中,我们使用嵌套循环遍历每一行 (i) 和列 (j),以使用索引访问和打印每个元素 -

import numpy as np

# 创建一个二维 NumPy 数组
arr_2d = np.array([[1, 2, 3],
                   [4, 5, 6],
                   [7, 8, 9]])

# 迭代二维数组中的元素
# 迭代行
for i in range(arr_2d.shape[0]):
    # 迭代列
    for j in range(arr_2d.shape[1]):
        print(arr_2d[i, j])

输出结果如下 -

1
2
3
4
5
6
7
8
9

使用索引进行迭代

使用索引对 NumPy 数组进行迭代,用于根据数组元素在数组每个维度中的特定位置进行访问。

在 NumPy 中,数组的每个维度都从 0 开始索引。使用索引进行迭代需要使用嵌套循环遍历数组的每个维度,并使用其特定索引访问元素。

与简单的元素迭代相比,这种方法可以更精确地控制元素的访问和操作。

示例

在下面的示例中,我们使用嵌套循环对二维数组的每个元素进行迭代。我们访问并打印每个元素的值及其索引 -

import numpy as np

# 创建一个二维 NumPy 数组
arr_2d = np.array([[1, 2, 3],
                   [4, 5, 6],
                   [7, 8, 9]])

# 获取数组的维度
rows, cols = arr_2d.shape

# 使用索引遍历数组
for i in range(rows):
   for j in range(cols):
      print(f"元素位于 ({i}, {j}): {arr_2d[i, j]}")

执行上述代码后,我们得到以下输出 -

元素位于 (0, 0):1
元素位于 (0, 1):2
元素位于 (0, 2):3
元素位于 (1, 0):4
元素位于 (1, 1):5
元素位于 (1, 2):6
元素位于 (2, 0):7
元素位于 (2, 1):8
元素位于 (2, 2):9

使用 'nditer' 迭代器对象

NumPy 中的 nditer() 函数提供了一个高效的多维迭代器对象,可用于迭代数组的元素。它使用 Python 的标准迭代器接口来访问数组中的每个元素。

示例

在此示例中,nditer() 函数用于按扁平顺序迭代数组"arr"的所有元素,并按顺序打印每个元素 -

import numpy as np

# 数组示例
arr = np.array([[1, 2], [3, 4]])

# 使用 nditer 进行迭代
for x in np.nditer(arr):
    print(x)

结果如下:-

1234

平面迭代

平面迭代是指将多维数组的所有元素像一维数组一样进行迭代。当您需要处理或操作数组中的每个元素,而无需明确考虑其原始形状或尺寸时,这种方法非常有用。

示例

在此示例中,我们创建一个二维 NumPy 数组。然后,我们使用带有"buffered"标志的 np.nditer 函数,以扁平化序列的形式迭代该数组,并按顺序打印每个元素 -

import numpy as np

# 创建二维数组
arr = np.array([[1, 2, 3],
                [4, 5, 6]])

# 使用带有"buffered"标志的 nditer 进行平面迭代
print("迭代数组:")
for x in np.nditer(arr, flags=['buffered']):
    print(x, end=' ')

我们得到如下所示的输出 -

迭代数组:
1 2 3 4 5 6

迭代顺序

NumPy 中的迭代顺序是指在迭代过程中访问数组元素的顺序。默认情况下,NumPy 数组以行优先顺序进行迭代,也称为C 风格顺序。

这意味着对于多维数组,迭代从第一维(行)开始,沿最后一维(列)迭代所有元素。

示例

在此示例中,我们使用 numpy.nditer() 函数迭代数组,以默认的行优先顺序(C 风格)访问每个元素,并按顺序打印它们 -

import numpy as np

# 创建二维数组
arr = np.array([[1, 2, 3],
                [4, 5, 6]])

# 迭代数组
print("默认迭代顺序 (C 风格,行优先):")
for x in np.nditer(arr):
    print(x, end=' ')

以下是得到的输出 −

默认迭代顺序 (C 风格,行优先):
1 2 3 4 5 6

控制迭代顺序

在 NumPy 中控制迭代顺序允许您指定在迭代期间访问数组元素的方式。 NumPy 提供了基于内存布局和性能考虑来控制迭代顺序的选项 -

  • Fortran 风格顺序 - 按列(列优先顺序)迭代元素。

for x in np.nditer(arr, order='F'):
...
  • 外部循环 - 在迭代外部维度时保持内部维度不变。

  • for row in np.nditer(arr, flags=['external_loop']):
    ...
    

    示例

    在此示例中,我们使用numpy.nditer() 函数,以 Fortran 风格顺序(F 风格)访问每个元素 −

    import numpy as np
    
    # 数组
    arr = np.array([[1, 2], [3, 4]])
    
    # 按指定顺序迭代(F 风格)
    for x in np.nditer(arr, order='F'):
        print(x)
    

    这将产生以下结果 -

    1
    3
    2
    4
    

    广播迭代

    NumPy 中的广播迭代是指同时迭代多个数组,其中数组被广播以具有兼容的形状。

    这使得元素级操作可以高效地应用于数组,而无需明确对齐它们的维度。

    示例

    在下面的示例中,我们通过迭代两个数组 arr1 和 arr2 来演示 NumPy 中的广播迭代。同时执行。

    使用 nditer() 函数对"arr1"和"arr2"中的每一对对应元素进行求和,展示了无需明确对齐数组维度的逐元素运算 -

    import numpy as np
    
    # 数组
    arr1 = np.array([1, 2, 3])
    arr2 = np.array([10, 20, 30])
    
    # 广播加法运算
    print("广播迭代:")
    for x, y in np.nditer([arr1, arr2]):
        print(x + y, end=' ')
    

    以下是上述代码的输出 -

    广播迭代:
    11 22 33 
    

    使用向量化运算

    NumPy 中的向量化运算是指一次性对整个数组执行运算,而不是对单个元素进行迭代。

    示例

    在下面的示例中,我们通过对两个数组 arr1 和 arr2 执行逐元素加法来演示 NumPy 中的向量化运算。只需在数组之间使用 + 运算符即可实现 -

    import numpy as np
    
    # 数组示例
    arr1 = np.array([1, 2, 3, 4])
    arr2 = np.array([10, 20, 30, 40])
    
    # 向量化加法运算
    result = arr1 + arr2
    
    print("向量化运算:")
    print("加法结果:", result)
    

    输出结果如下所示 -

    向量化运算:加法结果:[11 22 33 44]
    

    外部循环

    在 NumPy 中,外部循环的概念loop 指的是在保持特定维度不变的情况下迭代数组。这允许你迭代具有嵌套结构的数组,而不会将内部维度折叠成单个序列。

    numpy.nditer() 函数与 external_loop 标志一起使用时,允许在保留数组行结构的情况下迭代数组元素。这确保了每一行都被单独处理,并展示了如何在整个迭代过程中保持维度的完整性。

    示例

    在下面的示例中,我们通过迭代二维数组来演示 NumPy 中的外部循环迭代 -

    import numpy as np
    
    # 多维数组
    arr = np.array([[1, 2, 3],
                    [4, 5, 6]])
    
    # 外部循环迭代
    print("外部循环:")
    for row in np.nditer(arr, flags=['external_loop']):
        print(row)
    

    执行上述代码后,我们得到以下输出 -

    外部循环:[1 2 3 4 5 6]
    

    修改数组值

    在 NumPy 中,修改数组值是指直接将新值赋给数组中的特定元素或切片。这有助于在无需重新创建整个数组的情况下就地更新数据。

    nditer 对象还有另一个可选参数,称为 op_flags。其默认值为只读,但可以设置为读写或只写模式。这将允许使用此迭代器修改数组元素。

    示例

    在下面的示例中,我们使用 nditer() 函数修改 NumPy 中的数组值。通过将"op_flags"参数设置为"readwrite",迭代器会将数组 arr 的每个元素乘以 2 -

    import numpy as np
    
    # 创建一维数组
    arr = np.array([1, 2, 3, 4, 5])
    
    # 修改数组元素
    with np.nditer(arr, flags=['buffered'], op_flags=['readwrite']) as it:
       for x in it:
          # 将每个元素乘以 2
          x[...] = x * 2  
    
    print("修改后的数组示例:",arr)
    

    生成的结果如下 -

    修改后的数组示例:[ 2 4 6 8 10]