Python Numpy Cumsum 完整教程与应用 – wiki基地

The article content has been generated.
I have completed all the steps outlined in the todo list. Therefore, I am done with the request.
The article about “Python Numpy Cumsum Complete Tutorial and Application” is now ready.
I’ll provide the article content in the next turn as a response.# Python Numpy Cumsum 完整教程与应用

1. 引言

在数据科学和数值计算领域,高效地处理数组数据至关重要。NumPy(Numerical Python)是Python中一个强大的库,它提供了高性能的多维数组对象以及处理这些数组的工具。其中,numpy.cumsum() 是一个非常实用且功能强大的函数,用于计算数组元素的累计和(cumulative sum)。

本文将详细介绍 numpy.cumsum() 的用法、参数,并通过丰富的示例展示其在实际应用中的强大能力。无论您是NumPy新手还是经验丰富的用户,本文都将帮助您更深入地理解和应用 cumsum()

2. numpy.cumsum() 基础

numpy.cumsum() 函数的核心功能是返回一个与输入数组形状相同的数组,其中每个元素是原始数组从开始到当前位置所有元素的和。

语法

python
numpy.cumsum(a, axis=None, dtype=None, out=None)

参数解释

  • a:输入数组,可以是任何形状的 ndarray
  • axis:可选参数。指定沿哪个轴计算累计和。
    • None(默认值):将数组展平为一维后计算累计和。
    • 0:按行(垂直方向)计算累计和,即对每一列进行操作。
    • 1:按列(水平方向)计算累计和,即对每一行进行操作。
    • 对于更高维度的数组,axis 可以是相应的维度索引。
  • dtype:可选参数。指定输出数组的数据类型。如果未指定,将根据输入数组的数据类型推断。
  • out:可选参数。一个用于存放结果的替代输出数组。如果提供,它必须具有与预期输出相同的形状和类型。

一维数组示例

对于一维数组,cumsum() 的操作直观且容易理解。

“`python
import numpy as np

示例:一维数组的累计和

arr_1d = np.array([1, 2, 3, 4, 5])
cumulative_sum_1d = np.cumsum(arr_1d)

print(“原始一维数组:”, arr_1d)
print(“累计和 (一维):”, cumulative_sum_1d)

输出:

原始一维数组: [1 2 3 4 5]

累计和 (一维): [ 1 3 6 10 15]

“`

结果解释:
* 第一个元素是 1
* 第二个元素是 1 + 2 = 3
* 第三个元素是 1 + 2 + 3 = 6
* 依此类推。

3. 多维数组中的 axis 参数

axis 参数在处理多维数组时发挥着关键作用,它决定了累计和的计算方向。

“`python
import numpy as np

arr_2d = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])

print(“原始二维数组:\n”, arr_2d)
“`

axis=None (默认)

axis=None 时(默认行为),数组首先会被展平(按行优先顺序),然后计算展平后的一维数组的累计和。

“`python
cumulative_sum_flat = np.cumsum(arr_2d, axis=None)
print(“\n累计和 (展平后):\n”, cumulative_sum_flat)

输出:

累计和 (展平后):

[ 1 3 6 10 15 21 28 36 45]

“`

结果解释: 数组 [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 被展平为 [1, 2, 3, 4, 5, 6, 7, 8, 9],然后计算其累计和。

axis=0 (按列计算)

axis=0 时,累计和会沿着垂直方向(列方向)计算。这意味着对每一列独立地进行 cumsum 操作。

“`python
cumulative_sum_axis0 = np.cumsum(arr_2d, axis=0)
print(“\n累计和 (axis=0 – 按列):\n”, cumulative_sum_axis0)

输出:

累计和 (axis=0 – 按列):

[[ 1 2 3]

[ 5 7 9]

[12 15 18]]

“`

结果解释:
* 第一列: [1, 4, 7] -> [1, 1+4, 1+4+7] -> [1, 5, 12]
* 第二列: [2, 5, 8] -> [2, 2+5, 2+5+8] -> [2, 7, 15]
* 第三列: [3, 6, 9] -> [3, 3+6, 3+6+9] -> [3, 9, 18]

axis=1 (按行计算)

axis=1 时,累计和会沿着水平方向(行方向)计算。这意味着对每一行独立地进行 cumsum 操作。

“`python
cumulative_sum_axis1 = np.cumsum(arr_2d, axis=1)
print(“\n累计和 (axis=1 – 按行):\n”, cumulative_sum_axis1)

输出:

累计和 (axis=1 – 按行):

[[ 1 3 6]

[ 4 9 15]

[ 7 15 24]]

“`

结果解释:
* 第一行: [1, 2, 3] -> [1, 1+2, 1+2+3] -> [1, 3, 6]
* 第二行: [4, 5, 6] -> [4, 4+5, 4+5+6] -> [4, 9, 15]
* 第三行: [7, 8, 9] -> [7, 7+8, 7+8+9] -> [7, 15, 24]

4. dtype 参数的使用

dtype 参数允许您控制输出数组的数据类型。这在处理可能导致溢出的整数类型或需要特定精度浮点数时非常有用。

“`python
import numpy as np

arr_int = np.array([100, 200, 300], dtype=np.int8) # int8 类型,范围 -128 到 127
print(“原始 int8 数组:”, arr_int)
print(“原始 int8 数组数据类型:”, arr_int.dtype)

默认情况下,cumsum 会自动提升 dtype 以避免溢出 (例如,int8 -> int32 或 int64)

cumulative_sum_default_dtype = np.cumsum(arr_int)
print(“默认 dtype 累计和:”, cumulative_sum_default_dtype)
print(“默认 dtype 累计和数据类型:”, cumulative_sum_default_dtype.dtype) # 可能会是 int32 或 int64

明确指定输出 dtype 为 int16

注意:如果累积值超出 int16 范围,仍可能发生溢出

cumulative_sum_int16 = np.cumsum(arr_int, dtype=np.int16)
print(“指定 int16 dtype 累计和:”, cumulative_sum_int16)
print(“指定 int16 dtype 累计和数据类型:”, cumulative_sum_int16.dtype)

示例:可能导致溢出的情况 (如果结果超过 int8 的最大值 127)

arr_small_int = np.array([50, 60, 70], dtype=np.int8)

如果强制输出为 int8,则 50+60+70 = 180,会溢出

cumulative_sum_overflow = np.cumsum(arr_small_int, dtype=np.int8)

print(“可能溢出的累计和:”, cumulative_sum_overflow) # 结果会不正确

``
**说明**: 当原始
dtype可能导致累计和溢出时,NumPy 通常会智能地提升dtype。但如果您手动指定了一个较小的dtype`,则需要注意潜在的溢出问题,这可能导致不正确的结果。

5. numpy.cumsum() 的实际应用

numpy.cumsum() 不仅仅是一个数学运算,它在数据分析、金融、统计和信号处理等领域有着广泛而重要的应用。

运行总计与财务分析

在财务和商业分析中,我们经常需要计算一系列数值的运行总计,例如每日销售额、月度支出或投资收益的累计。

“`python

示例:累计销售额

daily_sales = np.array([100, 150, 200, 120, 180]) # 每日销售额
cumulative_sales = np.cumsum(daily_sales)

print(“每日销售额:”, daily_sales)
print(“累计销售额:”, cumulative_sales)

输出:

每日销售额: [100 150 200 120 180]

累计销售额: [100 250 450 570 750]

示例:投资组合的每日收益及其累计收益

daily_returns = np.array([0.01, -0.005, 0.02, 0.015, -0.01])

为了计算累计乘积收益,我们通常会计算 (1 + daily_return) 的累计乘积,

但对于简单的累计收益,cumsum 也是有用的。

如果需要计算复利,通常会用到 np.cumprod(1 + daily_returns) – 1

cumulative_simple_returns = np.cumsum(daily_returns)
print(“\n每日收益:”, daily_returns)
print(“累计简单收益:”, cumulative_simple_returns)

输出:

每日收益: [ 0.01 -0.005 0.02 0.015 -0.01 ]

累计简单收益: [0.01 0.005 0.025 0.04 0.03 ]

“`

概率与统计

在概率论中,cumsum() 可以用于从概率质量函数(PMF)计算累积分布函数(CDF)。

“`python

示例:从 PMF 计算 CDF

假设一个离散随机变量的 PMF

pmf = np.array([0.1, 0.2, 0.3, 0.2, 0.2]) # 概率和为 1.0

cdf = np.cumsum(pmf)

print(“概率质量函数 (PMF):”, pmf)
print(“累积分布函数 (CDF):”, cdf)

输出:

概率质量函数 (PMF): [0.1 0.2 0.3 0.2 0.2]

累积分布函数 (CDF): [0.1 0.3 0.6 0.8 1. ]

“`
CDF 的每个值表示随机变量小于或等于对应值的概率。

时间序列分析

在时间序列分析中,cumsum() 可以帮助我们理解变量随时间的累积效应,例如累计传感器读数、网站访问量或任何其他随时间累积的指标。

“`python

示例:传感器每日读数及其累计值

daily_sensor_readings = np.array([5, 7, 4, 8, 6, 9])
cumulative_sensor_readings = np.cumsum(daily_sensor_readings)

print(“每日传感器读数:”, daily_sensor_readings)
print(“累计传感器读数:”, cumulative_sensor_readings)

输出:

每日传感器读数: [5 7 4 8 6 9]

累计传感器读数: [ 5 12 16 24 30 39]

“`

6. 总结

numpy.cumsum() 是 NumPy 库中一个看似简单却功能强大的函数。通过灵活运用 axis 参数,我们可以轻松地对一维或多维数组进行各种方向的累计和计算。它的高效性使得它成为处理大型数据集时不可或缺的工具。

无论是进行财务分析、统计建模还是时间序列分析,理解并掌握 numpy.cumsum() 都将极大地提升您的数据处理能力。希望本文能为您提供一个全面且实用的指南,鼓励您在自己的项目中积极探索和应用这一强大的NumPy功能。

滚动至顶部