np.sum
详解
np.sum
是 NumPy 提供的一个函数,用于计算数组中元素的总和。它支持多种灵活的用法,包括对整个数组求和、按特定轴求和、指定加权求和等。是数据分析和数值计算中常用的函数之一。
1. 函数签名
numpy.sum(a, axis=None, dtype=None, out=None, keepdims=<no value>, initial=<no value>, where=<no value>)
2. 参数详解
必选参数
a
:- 输入数组,可以是任何形式的 NumPy 数组或支持广播的对象(如列表、元组等)。
可选参数
-
axis
:- 指定求和的轴(维度)。
- 默认值:
None
(即对所有元素求和)。 - 取值:
None
:对整个数组的所有元素求和。int
:沿指定的轴进行求和。tuple
:指定多个轴,对这些轴进行广播后求和。
-
dtype
:- 指定计算时的结果数据类型。
- 默认使用输入数组的类型,但如果结果可能超出范围(例如整型溢出),可以设置为更高的精度(如
float64
或int64
)。
-
out
:- 将结果存储到指定的数组中,而不是返回新的数组。
- 默认值:
None
。
-
keepdims
:- 是否保持求和操作后数组的维度。
- 默认值:
False
,会丢弃求和的维度。
-
initial
:- 求和的初始值,默认是
0
。
- 求和的初始值,默认是
-
where
:- 一个布尔掩码数组,指定在哪些位置进行求和操作。
- 例如,
where=[True, False, True]
,只会对第 1 和第 3 个元素求和。
3. 返回值
- 返回求和结果。
- 如果指定
axis
,返回一个降维后的数组,否则返回一个标量。
4. 示例
(1) 对整个数组求和
import numpy as np
a = np.array([[1, 2, 3], [4, 5, 6]])
result = np.sum(a)
print(result) # 输出 21
(2) 沿指定轴求和
- 沿 行(轴
0
)求和:
result = np.sum(a, axis=0)
print(result) # 输出 [5 7 9]
- 沿 列(轴
1
)求和:
result = np.sum(a, axis=1)
print(result) # 输出 [ 6 15]
(3) 指定数据类型
b = np.array([1, 2, 3], dtype=np.int8)
result = np.sum(b, dtype=np.int32)
print(result) # 输出 6(以更高精度计算结果)
(4) 使用布尔条件求和
c = np.array([1, 2, 3, 4, 5])
mask = c % 2 == 0 # 条件:取偶数
result = np.sum(c, where=mask)
print(result) # 输出 6(即 2 + 4)
(5) 保持维度
d = np.array([[1, 2, 3], [4, 5, 6]])
result = np.sum(d, axis=1, keepdims=True)
print(result)
# 输出:
# [[ 6]
# [15]]
5. 应用场景
- 矩阵计算:对特定维度的数据求和,如行和、列和。
- 统计分析:计算数据的总和,用于后续均值、方差等计算。
- 布尔数组处理:统计布尔条件满足的数量。
- 如
np.sum(condition_array)
等价于np.count_nonzero(condition_array)
。
- 如
- 加权求和:通过
where
参数选择性求和。
6. 注意事项
-
数据溢出:
- 对整型数组求和时可能发生溢出,尤其是低精度数据类型(如
int8
)。 - 解决方法:通过
dtype
指定更高精度的数据类型。
- 对整型数组求和时可能发生溢出,尤其是低精度数据类型(如
-
axis
的用法:- 对多维数组,
axis
参数的选择会影响结果的形状。 - 举例:对于形状为 ((3, 4, 5)) 的数组,
axis=1
将结果降维到 ((3, 5))。
- 对多维数组,
7. 底层原理
np.sum
是一个高效的矢量化操作,底层实现利用了 C 和 Fortran 进行优化,计算效率非常高。与 Python 的内置 sum()
函数相比,它可以直接在多维数组上操作,并支持并行化计算。
总结
np.sum
是 NumPy 提供的一个灵活且高效的数组求和函数,支持从简单的全数组求和到复杂的按条件加权求和等多种功能。在数据科学和数值计算中,np.sum
是一个必不可少的工具,使用时需灵活掌握其参数来适配不同需求。