第五章:NumPy 数组的基本运算


文档摘要

第五章:NumPy 数组的基本运算 第五章:NumPy 数组的基本运算 NumPy 的核心是其强大的 N 维数组对象 。理解如何对 NumPy 数组执行基本运算是进行高效数据分析和科学计算的关键。本章将深入探讨 NumPy 数组的基本运算,包括算术运算、比较运算、逻辑运算、广播机制以及一些常用的数学函数。 5.1 算术运算 NumPy 提供了丰富的算术运算符,可以对数组执行逐元素(element-wise)的运算。 5.1.1 基本算术运算符 NumPy 支持标准的加、减、乘、除和取模运算。这些运算符可以直接应用于数组,也可以应用于数组和标量之间。 5.1.

第五章:NumPy 数组的基本运算

第五章:NumPy 数组的基本运算

NumPy 的核心是其强大的 N 维数组对象 ndarray。理解如何对 NumPy 数组执行基本运算是进行高效数据分析和科学计算的关键。本章将深入探讨 NumPy 数组的基本运算,包括算术运算、比较运算、逻辑运算、广播机制以及一些常用的数学函数。

5.1 算术运算

NumPy 提供了丰富的算术运算符,可以对数组执行逐元素(element-wise)的运算。

5.1.1 基本算术运算符

NumPy 支持标准的加、减、乘、除和取模运算。这些运算符可以直接应用于数组,也可以应用于数组和标量之间。

import numpy as np a = np.array([1, 2, 3, 4]) b = np.array([5, 6, 7, 8]) # 加法 print("加法: a + b =", a + b) # [ 6 8 10 12] print("加法: a + 5 =", a + 5) # [ 6 7 8 9] # 减法 print("减法: a - b =", a - b) # [-4 -4 -4 -4] print("减法: a - 2 =", a - 2) # [-1 0 1 2] # 乘法 print("乘法: a * b =", a * b) # [ 5 12 21 32] print("乘法: a * 3 =", a * 3) # [ 3 6 9 12] # 除法 print("除法: a / b =", a / b) # [0.2 0.33333333 0.42857143 0.5 ] print("除法: a / 2 =", a / 2) # [0.5 1. 1.5 2. ] # 整除 print("整除: a // b =", a // b) # [0 0 0 0] print("整除: a // 2 =", a // 2) # [0 1 1 2] # 取模 print("取模: a % b =", a % b) # [1 2 3 4] print("取模: a % 2 =", a % 2) # [1 0 1 0] # 指数 print("指数: a ** 2 =", a ** 2) # [ 1 4 9 16]

5.1.2 NumPy 算术函数

NumPy 还提供了一些算术函数,例如 np.add(), np.subtract(), np.multiply(), np.divide(), np.floor_divide(), np.mod(), np.power() 等,它们与对应的运算符具有相同的功能,但有时在处理特殊情况(例如,需要指定输出数组)时更加方便。

a = np.array([1, 2, 3, 4]) b = np.array([5, 6, 7, 8]) # 加法 print("加法: np.add(a, b) =", np.add(a, b)) # 减法 print("减法: np.subtract(a, b) =", np.subtract(a, b)) # 乘法 print("乘法: np.multiply(a, b) =", np.multiply(a, b)) # 除法 print("除法: np.divide(a, b) =", np.divide(a, b)) # 整除 print("整除: np.floor_divide(a, b) =", np.floor_divide(a, b)) # 取模 print("取模: np.mod(a, b) =", np.mod(a, b)) # 指数 print("指数: np.power(a, 2) =", np.power(a, 2))

5.2 比较运算

NumPy 允许使用比较运算符(==, !=, <, >, <=, >=) 对数组进行逐元素比较。比较的结果是一个布尔数组,其中 True 表示满足条件,False 表示不满足条件。

a = np.array([1, 2, 3, 4, 5]) b = np.array([2, 2, 4, 4, 6]) # 等于 print("等于: a == b =", a == b) # [False True False True False] # 不等于 print("不等于: a != b =", a != b) # [ True False True False True] # 小于 print("小于: a < b =", a < b) # [ True False True False True] # 大于 print("大于: a > b =", a > b) # [False False False False False] # 小于等于 print("小于等于: a <= b =", a <= b) # [ True True True True True] # 大于等于 print("大于等于: a >= b =", a >= b) # [False True False True False]

5.3 逻辑运算

NumPy 提供了逻辑运算符(&, |, ~, ^)和相应的函数(np.logical_and(), np.logical_or(), np.logical_not(), np.logical_xor())用于对布尔数组进行逻辑运算。

a = np.array([True, False, True, False]) b = np.array([False, True, False, True]) # 与 print("与: a & b =", a & b) # [False False False False] print("与: np.logical_and(a, b) =", np.logical_and(a, b)) # 或 print("或: a | b =", a | b) # [ True True True True] print("或: np.logical_or(a, b) =", np.logical_or(a, b)) # 非 print("非: ~a =", ~a) # [False True False True] print("非: np.logical_not(a) =", np.logical_not(a)) # 异或 print("异或: a ^ b =", a ^ b) # [ True True True True] print("异或: np.logical_xor(a, b) =", np.logical_xor(a, b))

这些逻辑运算可以与比较运算结合使用,以实现更复杂的条件判断。

a = np.array([1, 2, 3, 4, 5]) # 找出大于 2 且小于 5 的元素 condition = (a > 2) & (a < 5) print("大于 2 且小于 5 的元素:", a[condition]) # [3 4]

5.4 广播(Broadcasting)

广播是 NumPy 中一个强大的特性,它允许对形状不同的数组进行算术运算。当两个数组的形状不完全相同时,NumPy 会尝试通过自动扩展数组的形状来使它们兼容。

广播的规则如下:

  1. 如果两个数组的维度数不同,则在维度数较小的数组的前面补 1,直到维度数相同。

  2. 如果两个数组的形状在任何维度上都不匹配,并且其中一个数组在该维度上的大小为 1,则沿着该维度扩展数组以匹配另一个数组的形状。

  3. 如果两个数组在任何维度上的形状都不匹配,并且两个数组在该维度上的大小都不为 1,则会引发错误。

a = np.array([1, 2, 3]) # 形状 (3,) b = np.array([[4], [5], [6]]) # 形状 (3, 1) # a 和 b 可以进行广播,得到形状为 (3, 3) 的结果 print("广播加法: a + b =", a + b) # [[5 6 7] # [6 7 8] # [7 8 9]]

在这个例子中,a 的形状是 (3,)b 的形状是 (3, 1)。根据广播规则,a 会被扩展为 [[1, 2, 3], [1, 2, 3], [1, 2, 3]],然后与 b 进行逐元素相加。

使用 mermaid 的 graph TD 图示说明广播过程:

5.5 常用的数学函数

NumPy 提供了大量的数学函数,可以对数组执行各种数学运算。这些函数通常是逐元素的,并且可以处理各种数据类型。

5.5.1 三角函数

NumPy 提供了常用的三角函数,例如 np.sin(), np.cos(), np.tan(), np.arcsin(), np.arccos(), np.arctan() 等。

a = np.array([0, np.pi/2, np.pi]) print("正弦: np.sin(a) =", np.sin(a)) # [0.0000000e+00 1.0000000e+00 1.2246468e-16] print("余弦: np.cos(a) =", np.cos(a)) # [ 1.000000e+00 6.123234e-17 -1.000000e+00]

5.5.2 指数和对数函数

NumPy 提供了指数函数 np.exp() 和对数函数 np.log(), np.log2(), np.log10() 等。

a = np.array([1, 2, 3]) print("指数: np.exp(a) =", np.exp(a)) # [ 2.71828183 7.3890561 20.08553692] print("自然对数: np.log(a) =", np.log(a)) # [0. 0.69314718 1.09861229] print("以 2 为底的对数: np.log2(a) =", np.log2(a)) # [0. 1. 1.5849625] print("以 10 为底的对数: np.log10(a) =", np.log10(a)) # [0. 0.30103 0.47712125]

5.5.3 其他数学函数

NumPy 还提供了许多其他数学函数,例如:

  • np.sqrt(): 计算平方根。

  • np.power(): 计算指数。

  • np.abs(): 计算绝对值。

  • np.round(): 四舍五入。

  • np.floor(): 向下取整。

  • np.ceil(): 向上取整。

a = np.array([-1.5, 2.7, -3.2]) print("平方根: np.sqrt(np.abs(a)) =", np.sqrt(np.abs(a))) # [1.22474487 1.64316767 1.78885438] print("绝对值: np.abs(a) =", np.abs(a)) # [1.5 2.7 3.2] print("四舍五入: np.round(a) =", np.round(a)) # [-2. 3. -3.] print("向下取整: np.floor(a) =", np.floor(a)) # [-2. 2. -4.] print("向上取整: np.ceil(a) =", np.ceil(a)) # [-1. 3. -3.]

5.6 聚合函数

NumPy 提供了许多聚合函数,可以对数组中的元素进行统计计算。

a = np.array([[1, 2, 3], [4, 5, 6]]) # 求和 print("求和: np.sum(a) =", np.sum(a)) # 21 print("按列求和: np.sum(a, axis=0) =", np.sum(a, axis=0)) # [5 7 9] print("按行求和: np.sum(a, axis=1) =", np.sum(a, axis=1)) # [ 6 15] # 求均值 print("求均值: np.mean(a) =", np.mean(a)) # 3.5 print("按列求均值: np.mean(a, axis=0) =", np.mean(a, axis=0)) # [2.5 3.5 4.5] print("按行求均值: np.mean(a, axis=1) =", np.mean(a, axis=1)) # [2. 5.] # 求最大值 print("求最大值: np.max(a) =", np.max(a)) # 6 print("按列求最大值: np.max(a, axis=0) =", np.max(a, axis=0)) # [4 5 6] print("按行求最大值: np.max(a, axis=1) =", np.max(a, axis=1)) # [3 6] # 求最小值 print("求最小值: np.min(a) =", np.min(a)) # 1 print("按列求最小值: np.min(a, axis=0) =", np.min(a, axis=0)) # [1 2 3] print("按行求最小值: np.min(a, axis=1) =", np.min(a, axis=1)) # [1 4] # 求标准差 print("求标准差: np.std(a) =", np.std(a)) # 1.707825127659933 print("按列求标准差: np.std(a, axis=0) =", np.std(a, axis=0)) # [1.5 1.5 1.5] print("按行求标准差: np.std(a, axis=1) =", np.std(a, axis=1)) # [0.81649658 0.81649658] # 求方差 print("求方差: np.var(a) =", np.var(a)) # 2.9166666666666665 print("按列求方差: np.var(a, axis=0) =", np.var(a, axis=0)) # [2.25 2.25 2.25] print("按行求方差: np.var(a, axis=1) =", np.var(a, axis=1)) # [0.66666667 0.66666667] # 求中位数 print("求中位数: np.median(a) =", np.median(a)) # 3.5 print("按列求中位数: np.median(a, axis=0) =", np.median(a, axis=0)) # [2.5 3.5 4.5] print("按行求中位数: np.median(a, axis=1) =", np.median(a, axis=1)) # [2. 5.]

总结

本章介绍了 NumPy 数组的基本运算,包括算术运算、比较运算、逻辑运算、广播机制以及常用的数学函数。掌握这些基本运算是使用 NumPy 进行高效数据分析和科学计算的基础。通过灵活运用这些运算,可以实现各种复杂的数据处理和分析任务。


发布者: 作者: 转发
评论区 (0)
U