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

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

8090eecd4fe3d2bfb5bb236e9633ba2.png

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


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 数组的灵活性,使得我们可以轻松地对形状不同的数组执行复杂的数学运算。掌握广播是提高数据处理效率和性能的关键。


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 进行数据分析的人都应该掌握的。

目录
相关文章
|
5月前
|
机器学习/深度学习 并行计算 大数据
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧2
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧
185 10
|
5月前
|
索引 Python
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧1
【Python篇】NumPy完整指南(上篇):掌握数组、矩阵与高效计算的核心技巧
212 4
|
5月前
|
PyTorch 算法框架/工具 Python
Pytorch学习笔记(十):Torch对张量的计算、Numpy对数组的计算、它们之间的转换
这篇文章是关于PyTorch张量和Numpy数组的计算方法及其相互转换的详细学习笔记。
91 0
|
7月前
|
分布式计算 并行计算 大数据
NumPy 并行计算与分布式部署
【8月更文第30天】随着数据量的不断增长,传统的单机计算模型已经难以满足对大规模数据集处理的需求。并行和分布式计算成为了处理这些大数据集的关键技术。虽然 NumPy 本身并不直接支持并行计算,但可以通过结合其他库如 Numba 和 Dask 来实现高效的并行和分布式计算。
75 1
|
8月前
|
SQL 并行计算 API
Dask是一个用于并行计算的Python库,它提供了类似于Pandas和NumPy的API,但能够在大型数据集上进行并行计算。
Dask是一个用于并行计算的Python库,它提供了类似于Pandas和NumPy的API,但能够在大型数据集上进行并行计算。
|
9月前
|
机器学习/深度学习 C语言 索引
数组计算模块NumPy(一)
NumPy是Python科学计算的核心库,提供高性能的数组和矩阵操作,支持大量数学函数。它包括一维、二维到多维数组,并通过C实现,优化了计算速度。
数组计算模块NumPy(一)
|
9月前
|
索引 Python
数组计算模块NumPy(二)
NumPy教程概要:介绍数组切片、二维数组索引、重塑、转置和数组操作。讨论了切片语法`[start:stop:step]`,二维数组的索引方式,以及reshape方法改变数组形状。涉及转置通过`.T`属性或`transpose()`函数实现,数组增加使用`hstack()`和`vstack()`,删除用`delete()`。还提到了矩阵运算,包括加减乘除,并展示了`numpy.dot()`和`@`运算符的使用。最后提到了排序函数`sort()`、`argsort()`和`lexsort()`,以及NumPy的统计分析函数如均值、标准差等。
|
10月前
|
存储 数据挖掘 API
【NumPy基础】- Numpy数组和矢量计算
【NumPy基础】- Numpy数组和矢量计算
|
10月前
|
存储 数据管理 数据挖掘
《Numpy 简易速速上手小册》第7章:Numpy 文件输入输出(2024 最新版)
《Numpy 简易速速上手小册》第7章:Numpy 文件输入输出(2024 最新版)
88 1
|
10月前
|
算法 数据挖掘 数据处理
《Numpy 简易速速上手小册》第10章:Numpy案例研究和实践技巧(2024 最新版)
《Numpy 简易速速上手小册》第10章:Numpy案例研究和实践技巧(2024 最新版)
100 0