NumPy基础
NumPy基础
NumPy(Numerical Python)是Python科学计算的基础库,几乎所有机器学习和数据分析库都依赖于NumPy。掌握NumPy是进入数据科学领域的必经之路。
数组创建
NumPy的核心是ndarray(N-dimensional array),它提供了比Python原生列表更高效的数值计算能力。
import numpy as np
arr1 = np.array([1, 2, 3, 4, 5])
print(f"一维数组: {arr1}, 类型: {type(arr1)}")
arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(f"二维数组:\n{arr2d}")
print(f"形状: {arr2d.shape}, 维度: {arr2d.ndim}")
zeros = np.zeros((3, 4))
ones = np.ones((2, 3))
eye = np.eye(4)
linspace = np.linspace(0, 1, 5)
print(f"等间距数组: {linspace}")
数组属性与数据类型
理解数组的属性对于高效使用NumPy至关重要。
arr = np.array([[1, 2, 3], [4, 5, 6]], dtype=np.float32)
print(f"形状: {arr.shape}")
print(f"总元素数: {arr.size}")
print(f"维度数: {arr.ndim}")
print(f"数据类型: {arr.dtype}")
print(f"每个元素字节数: {arr.itemsize}")
print(f"总字节数: {arr.nbytes}")
# 类型转换
arr_int = arr.astype(np.int64)
print(f"转换后类型: {arr_int.dtype}")
索引与切片
NumPy提供了强大的索引功能,支持多种方式访问数组元素。
arr = np.arange(12).reshape(3, 4)
print(f"原始数组:\n{arr}")
# 基本索引
print(f"第一行: {arr[0]}")
print(f"第二列: {arr[:, 1]}")
print(f"子数组:\n{arr[0:2, 1:3]}")
# 花式索引
rows = [0, 2]
cols = [1, 3]
print(f"花式索引结果: {arr[rows, cols]}")
# 布尔索引
mask = arr > 5
print(f"大于5的元素: {arr[mask]}")
数组运算
NumPy的向量化运算比Python循环快数十甚至数百倍。
a = np.array([1, 2, 3, 4])
b = np.array([5, 6, 7, 8])
# 逐元素运算
print(f"加法: {a + b}")
print(f"乘法: {a * b}")
print(f"平方: {a ** 2}")
# 数学函数
print(f"正弦值: {np.sin(a)}")
print(f"对数: {np.log(a)}")
print(f"指数: {np.exp(a)}")
# 聚合操作
matrix = np.array([[1, 2, 3], [4, 5, 6]])
print(f"总和: {matrix.sum()}")
print(f"均值: {matrix.mean():.2f}")
print(f"按行求和: {matrix.sum(axis=1)}")
print(f"按列求均值: {matrix.mean(axis=0)}")
广播机制
广播(Broadcasting)是NumPy中最重要的特性之一,它允许不同形状的数组进行运算。
# 广播示例
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
vector = np.array([10, 20, 30])
# 每行加上同一向量
result = matrix + vector
print(f"广播结果:\n{result}")
# 广播规则演示
a = np.ones((3, 4))
b = np.arange(4)
print(f"a + b:\n{a + b}")
# 标量广播
c = matrix * 2
print(f"标量广播:\n{c}")
线性代数运算
NumPy提供了完整的线性代数工具集,是机器学习的核心基础。
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
# 矩阵乘法
print(f"矩阵乘法:\n{np.dot(A, B)}")
print(f"@运算符:\n{A @ B}")
# 转置
print(f"转置:\n{A.T}")
# 行列式
print(f"行列式: {np.linalg.det(A):.2f}")
# 特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eig(A)
print(f"特征值: {eigenvalues}")
# 逆矩阵
print(f"逆矩阵:\n{np.linalg.inv(A)}")
NumPy是机器学习的基石,熟练掌握NumPy将为后续学习TensorFlow、PyTorch等深度学习框架打下坚实基础。建议多动手实践,通过解决实际问题来加深理解。