《Numpy 简易速速上手小册》第5章:Numpy高效计算与广播(2024 最新版)

《Numpy 简易速速上手小册》第5章:Numpy高效计算与广播(2024 最新版)_第1张图片

文章目录

  • 5.1 向量化计算
    • 5.1.1 基础知识
    • 5.1.2 完整案例:股票数据分析
    • 5.1.3 拓展案例 1:多维数组运算
    • 5.1.4 拓展案例 2:复杂函数的向量化应用
  • 5.2 广播机制
    • 5.2.1 基础知识
    • 5.2.2 完整案例:二维数据与一维数据运算
    • 5.2.3 拓展案例 1:标准化二维数据
    • 5.2.4 拓展案例 2:多维度广播
  • 5.3 性能优化技巧
    • 5.3.1 基础知识
    • 5.3.2 完整案例:大型数据集处理
    • 5.3.3 拓展案例 1:就地操作优化
    • 5.3.4 拓展案例 2:利用内置函数处理多维数据

5.1 向量化计算

5.1.1 基础知识

向量化计算是 Numpy 的核心特性之一,它允许我们对整个数组执行操作,而不是单独对数组的每个元素进行循环处理。这种操作不仅代码更加简洁易读,还能大幅提升计算效率。

  • 避免循环:通过直接对数组进行操作,避免了 Python 中昂贵的循环。
  • 并行处理:向量化操作允许 CPU 并行处理数据,提升了性能。
  • 广义应用:适用于加减乘除等基本运算,也适用于更复杂的数学函数。

5.1.2 完整案例:股票数据分析

假设你正在分析股市数据,需要计算股票的日收益率。

import numpy as np

# 假设这是连续五天的股票价格
stock_prices = np.array([100, 102, 105, 110, 108])

# 计算日收益率
daily_returns = (stock_prices[1:] - stock_prices[:-1]) / stock_prices[:-1]

print("Daily Returns:", daily_returns)

在这个案例中,我们使用向量化操作一步计算了股票的日收益率,避免了循环遍历每个股价的需要。

5.1.3 拓展案例 1:多维数组运算

向量化不仅适用于一维数组,也同样适用于多维数组。

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

# 计算每个元素的平方
squared_matrix = matrix ** 2

print("Squared Matrix:\n", squared_matrix)

在这个案例中,我们对一个二维数组的每个元素进行了平方运算。

5.1.4 拓展案例 2:复杂函数的向量化应用

向量化计算也可以用于更复杂的数学函数和自定义操作。

# 定义一个自定义函数
def custom_operation(x):
    return x**2 - 2*x + 1

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

# 向量化地应用自定义函数
result = custom_operation(data)

print("Result of Custom Operation:", result)

在这个案例中,我们定义了一个自定义函数并将其向量化地应用到一个数组上,展示了向量化对于复杂操作的有效性。

向量化计算是 Numpy 的强大之处,它不仅提升了代码的执行效率,还使代码更加简洁和易于理解。掌握向量化是成为高效数据科学家的关键一步。

《Numpy 简易速速上手小册》第5章:Numpy高效计算与广播(2024 最新版)_第2张图片


5.2 广播机制

5.2.1 基础知识

广播机制是 Numpy 中的一个强大特性,它允许对不同形状的数组进行数学运算。这种机制遵循特定的规则来“广播”较小数组的形状以匹配较大数组的形状。

  • 广播规则
    1. 如果两个数组维度数不同,形状会从较小数组的末端开始补齐。
    2. 在任何一个维度上,数组的大小要么相同,要么其中一个为 1,要么其中一个不存在。
    3. 当数组的大小在某个维度上为 1 时,这个维度上的数值会沿此维度复制扩展。

广播机制使得数组运算在不同形状的数组间变得可能,并且在内存中无需实际复制数据。

5.2.2 完整案例:二维数据与一维数据运算

假设你在处理一个二维数据集,并想将其每一行都加上一个一维数组。

import numpy as np

# 一个 3x3 的二维数组
matrix = np.array([[1, 2, 3],
                   [4, 5, 6],
                   [7, 8, 9]])

# 一个一维数组
vector = np.array([1, 0, -1])

# 使用广播机制进行运算
result = matrix + vector

print("Result of Broadcasting:\n", result)

在这个案例中,一维数组 vector 被广播到与二维数组 matrix 相同的形状,并执行了逐元素相加的操作。

5.2.3 拓展案例 1:标准化二维数据

广播机制可以用于更复杂的数据处理任务,例如标准化一个二维数组的每一列。

# 生成一个 5x3 的随机数组
data = np.random.random((5, 3))

# 计算每列的均值和标准差
mean = data.mean(axis=0)
std = data.std(axis=0)

# 标准化数据
normalized_data = (data - mean) / std

print("Normalized Data:\n", normalized_data)

在这个案例中,我们计算了数组每列的均值和标准差,并用广播机制将每列数据标准化。

5.2.4 拓展案例 2:多维度广播

广播机制同样适用于更高维度的数组运算。

# 创建一个 4x1x3 的三维数组
array_3d = np.arange(12).reshape((4, 1, 3))

# 创建一个 1x3 的一维数组
array_1d = np.array([1, 2, 3])

# 广播运算
result_3d = array_3d + array_1d

print("Result of Broadcasting a 3D and 1D array:\n", result_3d)

在这个案例中,一维数组在与三维数组相加时被广播到匹配的形状,然后进行逐元素相加。

广播机制极大地增强了 Numpy 数组的灵活性,使得我们可以轻松地对形状不同的数组执行复杂的数学运算。掌握广播是提高数据处理效率和性能的关键。

《Numpy 简易速速上手小册》第5章:Numpy高效计算与广播(2024 最新版)_第3张图片


5.3 性能优化技巧

5.3.1 基础知识

在处理大型数据集或执行复杂数据操作时,性能成为一个关键因素。Numpy 提供了多种优化技巧,帮助提高代码的运行效率。

  • 预分配内存:提前分配好所需的数组空间,避免在数据处理过程中不断扩展数组,这样可以减少内存分配和复制的开销。
  • 避免不必要的复制:尽量使用 Numpy 的就地操作(in-place operations)来避免不必要的内存复制。
  • 使用内置函数:利用 Numpy 的内置函数,这些函数底层采用 C 或 Fortran 编写,比 Python 循环快得多。
  • 向量化操作:尽量使用向量化操作代替循环,这是提高 Numpy 性能的最重要手段之一。

5.3.2 完整案例:大型数据集处理

假设你在处理一个非常大的数据集,需要计算所有元素的总和。

import numpy as np

# 创建一个非常大的数组
large_array = np.random.rand(1000000)

# 预分配内存
result = 0.0

# 向量化求和
result = np.sum(large_array)

print("Sum of Large Array:", result)

在这个案例中,我们使用了 np.sum() 来向量化地对一个非常大的数组求和,这比 Python 内置的 sum() 函数快得多。

5.3.3 拓展案例 1:就地操作优化

在进行数组操作时,就地修改数组可以节约大量内存。

# 创建一个大型数组
large_array = np.random.rand(1000000)

# 就地操作修改数组
large_array *= 2.0  # 直接在原数组上进行操作

print("Modified Large Array:", large_array)

在这个案例中,我们直接在原数组上进行了操作,而不是创建一个新的数组,这样可以显著减少内存的使用。

5.3.4 拓展案例 2:利用内置函数处理多维数据

当处理多维数据时,使用 Numpy 的内置函数可以显著提高性能。

# 创建一个大型的多维数组
large_multi_array = np.random.rand(1000, 1000)

# 使用内置函数计算每列的平均值
column_means = np.mean(large_multi_array, axis=0)

print("Column Means:", column_means)

在这个案例中,我们使用了 np.mean() 来计算大型多维数组每列的平均值,这比手动编写循环快得多,并且代码也更简洁。

掌握这些性能优化技巧,你将能够更有效地处理大型数据集,并且提高数据处理的效率。这些技巧是每个使用 Numpy 进行数据分析的人都应该掌握的。

你可能感兴趣的:(《Numpy,简易速速上手小册》,numpy)