NumPy -数组运算与操作
数组运算与操作
目录
- 算术运算
- 比较运算
- 逻辑运算
- 数学函数
- 数组操作
- 实际应用示例
算术运算
基本算术运算
import numpy as npa = np.array([1, 2, 3, 4, 5])
b = np.array([10, 20, 30, 40, 50])# 加法
print(f"a + b: {a + b}")# 减法
print(f"a - b: {a - b}")# 乘法(元素级)
print(f"a * b: {a * b}")# 除法
print(f"b / a: {b / a}")# 幂运算
print(f"a ** 2: {a ** 2}")# 取模
print(f"b % a: {b % a}")# 整除
print(f"b // a: {b // a}")
广播运算
import numpy as nparr = np.array([[1, 2, 3], [4, 5, 6]])# 标量运算
print(f"arr + 10:\n{arr + 10}")
print(f"arr * 2:\n{arr * 2}")
print(f"arr ** 2:\n{arr ** 2}")# 数组与数组运算
arr2 = np.array([10, 20, 30])
print(f"\narr + arr2:\n{arr + arr2}")
累积运算
import numpy as nparr = np.array([1, 2, 3, 4, 5])# 累积和
print(f"累积和: {arr.cumsum()}")# 累积积
print(f"累积积: {arr.cumprod()}")# 二维数组累积
arr_2d = np.array([[1, 2, 3], [4, 5, 6]])
print(f"\n数组:\n{arr_2d}")
print(f"按行累积和:\n{arr_2d.cumsum(axis=0)}")
print(f"按列累积和:\n{arr_2d.cumsum(axis=1)}")
比较运算
基本比较
import numpy as npa = np.array([1, 2, 3, 4, 5])
b = np.array([5, 4, 3, 2, 1])# 比较运算返回布尔数组
print(f"a > b: {a > b}")
print(f"a >= b: {a >= b}")
print(f"a < b: {a < b}")
print(f"a <= b: {a <= b}")
print(f"a == b: {a == b}")
print(f"a != b: {a != b}")
比较函数
import numpy as nparr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])# 检查所有元素是否满足条件
print(f"所有元素 > 0: {np.all(arr > 0)}")
print(f"所有元素 < 5: {np.all(arr < 5)}")# 检查是否有元素满足条件
print(f"有元素 > 8: {np.any(arr > 8)}")
print(f"有元素 < 0: {np.any(arr < 0)}")# 比较两个数组
a = np.array([1, 2, 3])
b = np.array([1, 2, 4])
print(f"\na == b 的所有元素: {np.all(a == b)}")
print(f"a == b 的任意元素: {np.any(a == b)}")
逻辑运算
布尔逻辑运算
import numpy as npa = np.array([True, False, True, False])
b = np.array([True, True, False, False])# 逻辑与
print(f"a & b: {a & b}")# 逻辑或
print(f"a | b: {a | b}")# 逻辑非
print(f"~a: {~a}")# 逻辑异或
print(f"a ^ b: {a ^ b}")# 数值数组的逻辑运算
x = np.array([1, 2, 3, 4, 5])
y = np.array([5, 4, 3, 2, 1])print(f"\n(x > 2) & (y < 4): {(x > 2) & (y < 4)}")
print(f"(x > 3) | (y < 2): {(x > 3) | (y < 2)}")
条件函数
import numpy as np# where 函数
arr = np.array([1, 2, 3, 4, 5])
result = np.where(arr > 3, arr, 0)
print(f"where(arr > 3, arr, 0): {result}")# 复杂条件
x = np.array([1, 2, 3, 4, 5])
y = np.array([6, 7, 8, 9, 10])
condition = np.array([True, False, True, False, True])
result = np.where(condition, x, y)
print(f"\nwhere(condition, x, y): {result}")
数学函数
基本数学函数
import numpy as nparr = np.array([1, 4, 9, 16, 25])# 平方根
print(f"sqrt: {np.sqrt(arr)}")# 平方
print(f"square: {np.square(arr)}")# 指数
print(f"exp: {np.exp([1, 2, 3])}")# 对数
print(f"log: {np.log([1, np.e, np.e**2])}")
print(f"log10: {np.log10([1, 10, 100])}")
print(f"log2: {np.log2([1, 2, 4, 8])}")# 幂函数
arr = np.array([2, 3, 4])
print(f"\npower(2, arr): {np.power(2, arr)}")
三角函数
import numpy as nparr = np.array([0, np.pi/4, np.pi/2, np.pi])# 三角函数
print(f"sin: {np.sin(arr)}")
print(f"cos: {np.cos(arr)}")
print(f"tan: {np.tan(arr)}")# 反三角函数
arr_sin = np.array([0, 0.5, 1])
print(f"\narcsin: {np.arcsin(arr_sin)}")
print(f"arccos: {np.arccos(arr_sin)}")
print(f"arctan: {np.arctan(arr_sin)}")
舍入函数
import numpy as nparr = np.array([1.23, 4.56, 7.89, 10.11])# 四舍五入
print(f"around: {np.around(arr)}")
print(f"around(1): {np.around(arr, 1)}")# 向下取整
print(f"floor: {np.floor(arr)}")# 向上取整
print(f"ceil: {np.ceil(arr)}")# 截断
print(f"trunc: {np.trunc(arr)}")
数组操作
统计函数
import numpy as nparr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])print(f"数组:\n{arr}")# 求和
print(f"\n总和: {arr.sum()}")
print(f"每行和: {arr.sum(axis=1)}")
print(f"每列和: {arr.sum(axis=0)}")# 均值
print(f"\n均值: {arr.mean()}")
print(f"每行均值: {arr.mean(axis=1)}")
print(f"每列均值: {arr.mean(axis=0)}")# 标准差和方差
print(f"\n标准差: {arr.std()}")
print(f"方差: {arr.var()}")# 最大值和最小值
print(f"\n最大值: {arr.max()}")
print(f"最小值: {arr.min()}")
print(f"最大值位置: {arr.argmax()}")
print(f"最小值位置: {arr.argmin()}")
数组操作函数
import numpy as nparr = np.array([1, 2, 3, 4, 5])# 翻转
print(f"翻转: {np.flip(arr)}")# 排序
arr_unsorted = np.array([3, 1, 4, 1, 5, 9, 2, 6])
print(f"\n排序: {np.sort(arr_unsorted)}")# 去重
arr_dup = np.array([1, 2, 2, 3, 3, 3, 4])
print(f"\n去重: {np.unique(arr_dup)}")# 连接数组
a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
print(f"\n连接: {np.concatenate([a, b])}")
实际应用示例
示例 1:数据归一化
import numpy as np# 创建数据
data = np.random.randn(100, 5)
print(f"原始数据形状: {data.shape}")# Z-score 归一化
data_normalized = (data - data.mean(axis=0)) / data.std(axis=0)
print(f"归一化后均值: {data_normalized.mean(axis=0)}")
print(f"归一化后标准差: {data_normalized.std(axis=0)}")# Min-Max 归一化
data_minmax = (data - data.min(axis=0)) / (data.max(axis=0) - data.min(axis=0))
print(f"\nMin-Max 归一化后最小值: {data_minmax.min(axis=0)}")
print(f"Min-Max 归一化后最大值: {data_minmax.max(axis=0)}")
示例 2:矩阵运算
import numpy as np# 创建矩阵
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])# 矩阵加法
print(f"A + B:\n{A + B}")# 矩阵乘法(元素级)
print(f"\nA * B:\n{A * B}")# 矩阵点积
print(f"\nA @ B:\n{A @ B}")
print(f"np.dot(A, B):\n{np.dot(A, B)}")# 矩阵转置
print(f"\nA.T:\n{A.T}")
示例 3:信号处理
import numpy as np# 创建信号
t = np.linspace(0, 2*np.pi, 100)
signal = np.sin(t) + 0.5 * np.sin(3*t)# 计算信号能量
energy = np.sum(signal ** 2)
print(f"信号能量: {energy}")# 计算信号功率
power = np.mean(signal ** 2)
print(f"信号功率: {power}")# 计算信号的 RMS(均方根)
rms = np.sqrt(np.mean(signal ** 2))
print(f"信号 RMS: {rms}")# 信号的峰值
peak = np.max(np.abs(signal))
print(f"信号峰值: {peak}")
总结
数组运算与操作要点:
- 算术运算:+, -, *, /, **, %, //
- 比较运算:>, <, ==, !=, >=, <=
- 逻辑运算:&, |, ~, ^
- 数学函数:sqrt, exp, log, sin, cos 等
- 统计函数:sum, mean, std, var, max, min
- 数组操作:sort, unique, flip, concatenate
