NumPy数组创建与基本用法详解
NumPy 是 Python 科学计算的核心库提供高性能的多维数组对象ndarray及大量操作这些数组的函数。其核心优势在于向量化运算避免了低效的 Python 循环从而大幅提升计算效率 。1. 核心数据结构ndarray 数组ndarray是 NumPy 的基础它是一个同构数据相同数据类型的多维容器。1.1 数组创建可以通过多种方式创建数组。import numpy as np # 从列表或元组创建 arr_from_list np.array([1, 2, 3, 4, 5]) arr_2d np.array([[1, 2, 3], [4, 5, 6]]) # 创建特殊数组 zeros_arr np.zeros((3, 4)) # 3行4列的全0数组 ones_arr np.ones((2, 3)) # 2行3列的全1数组 full_arr np.full((2, 2), 7) # 2x2数组所有元素为7 eye_arr np.eye(3) # 3x3单位矩阵 arange_arr np.arange(0, 10, 2) # 类似range生成 [0, 2, 4, 6, 8] linspace_arr np.linspace(0, 1, 5) # 0到1之间等间隔的5个数 [0., 0.25, 0.5, 0.75, 1.]1.2 数组属性了解数组属性是操作的基础。arr np.array([[1, 2, 3], [4, 5, 6]]) print(数组维度 (ndim):, arr.ndim) # 2 print(数组形状 (shape):, arr.shape) # (2, 3) print(数组元素总数 (size):, arr.size) # 6 print(数组数据类型 (dtype):, arr.dtype) # int64 (取决于系统)2. 数组索引与切片索引和切片是访问和修改数组数据的主要方式。arr np.array([10, 20, 30, 40, 50]) # 基础索引 print(arr[0]) # 10 print(arr[-1]) # 50 # 切片 [start:stop:step] print(arr[1:4]) # [20 30 40] print(arr[::2]) # [10 30 50] # 多维数组索引与切片 arr_2d np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) print(arr_2d[0, 1]) # 2第0行第1列 print(arr_2d[1]) # [4 5 6]第1行 print(arr_2d[:, 1]) # [2 5 8]所有行的第1列 print(arr_2d[0:2, 1:3]) # [[2 3] [5 6]]第0-1行第1-2列3. 数组操作与变形3.1 形状操作arr np.arange(12) print(原数组:, arr) # [0 1 2 3 4 5 6 7 8 9 10 11] # 改变形状 (reshape)不改变数据 reshaped arr.reshape(3, 4) print(重塑为3x4: , reshaped) # 展平数组 (ravel或 flatten) flattened reshaped.flatten() print(展平后:, flattened) # 返回新数组 raveled reshaped.ravel() print(ravel后:, raveled) # 返回视图修改会影响原数组 # 转置 (transpose 或 .T) transposed reshaped.T print(转置后: , transposed)3.2 数组拼接与分割a np.array([[1, 2], [3, 4]]) b np.array([[5, 6], [7, 8]]) # 沿轴0垂直拼接 v_stack np.vstack((a, b)) # 或 np.concatenate((a, b), axis0) print(垂直拼接: , v_stack) # 沿轴1水平拼接 h_stack np.hstack((a, b)) # 或 np.concatenate((a, b), axis1) print(水平拼接: , h_stack) # 数组分割 arr np.arange(9).reshape(3, 3) print(原数组: , arr) split_arr np.split(arr, 3, axis0) # 沿轴0分成3份 print(沿行分割:, split_arr)4. 通用函数 (ufunc) 与广播通用函数对数组进行逐元素运算广播机制允许不同形状数组进行运算。# 通用函数示例 arr np.array([1.0, 4.0, 9.0]) print(平方根:, np.sqrt(arr)) # [1. 2. 3.] print(指数:, np.exp(arr)) print(正弦:, np.sin(arr)) # 广播机制示例 a np.array([[1, 2, 3], [4, 5, 6]]) # 形状 (2,3) b np.array([10, 20, 30]) # 形状 (3,) print(广播加法: , a b) # b被广播为 [[10,20,30], [10,20,30]]5. 数学与统计函数NumPy 提供了丰富的数学和统计函数。arr np.array([[1, 2, 3], [4, 5, 6]]) # 聚合函数 print(总和:, np.sum(arr)) # 21 print(沿轴0求和列和:, np.sum(arr, axis0)) # [5 7 9] print(沿轴1求和行和:, np.sum(arr, axis1)) # [6 15] print(平均值:, np.mean(arr)) # 3.5 print(标准差:, np.std(arr)) print(最小值:, np.min(arr)) print(最大值:, np.max(arr)) # 其他数学函数 print(累积和:, np.cumsum(arr)) # [ 1 3 6 10 15 21] print(累积积:, np.cumprod(arr))6. 随机数生成NumPy 的random模块是生成随机数的强大工具 。# 设置随机种子以确保结果可复现 np.random.seed(42) # 生成均匀分布随机数 uniform_arr np.random.rand(3, 4) # [0,1)均匀分布形状3x4 uniform_range np.random.uniform(low5.0, high10.0, size(2, 3)) # [5,10) 均匀分布 # 生成正态分布随机数 normal_arr np.random.randn(5) # 标准正态分布 N(0,1) normal_custom np.random.normal(loc100, scale15, size1000) # 均值100标准差15 # 生成随机整数 int_arr np.random.randint(low0, high10, size7) # [0,10) 的整数 # 从给定数组随机选择 choices np.random.choice([a, b, c, d], size10, p[0.1, 0.2, 0.3, 0.4]) # 带概率的随机选择7. 排序与搜索sort函数是 NumPy 中用于数组排序的核心函数 。arr np.array([3, 1, 4, 1, 5, 9, 2]) # 返回排序后的新数组 sorted_arr np.sort(arr) # 默认快速排序 print(排序后新数组:, sorted_arr) # [1 1 2 3 4 5 9] print(原数组未变:, arr) # [3 1 4 1 5 9 2] # 在原数组上排序 arr.sort() print(原数组已排序:, arr) # [1 1 2 3 4 5 9] # 多维数组沿指定轴排序 arr_2d np.array([[3, 1, 4], [1, 5, 9]]) sorted_axis0 np.sort(arr_2d, axis0) # 沿轴0行方向即按列排序 print(沿轴0排序: , sorted_axis0) sorted_axis1 np.sort(arr_2d, axis1) # 沿轴1列方向即按行排序 print(沿轴1排序: , sorted_axis1) # 获取排序后元素在原数组中的索引 arr np.array([30, 10, 40]) indices np.argsort(arr) print(排序索引:, indices) # [1 0 2]表示原数组中最小值的索引是1其次是0最大是28. 文件输入输出NumPy 可以方便地将数组读写到磁盘文件。# 保存数组到文件 arr_to_save np.array([[1, 2, 3], [4, 5, 6]]) np.savetxt(data.txt, arr_to_save, delimiter,, fmt%d) # 保存为整数逗号分隔 # 从文本文件加载数组 # loadtxt 函数功能强大支持多种参数 loaded_arr np.loadtxt(data.txt, delimiter,, dtypenp.int32) print(从文件加载的数组: , loaded_arr) # 二进制文件读写更高效保存数据类型和形状 np.save(data_binary.npy, arr_to_save) # 保存为 .npy 格式 loaded_binary np.load(data_binary.npy) # 加载 .npy 文件 print(从二进制文件加载: , loaded_binary)9. 实用高级技巧9.1 布尔索引与花式索引arr np.array([1, 2, 3, 4, 5, 6]) # 布尔索引 mask arr 3 print(布尔掩码:, mask) # [False False False True True True] print(条件选择:, arr[mask]) # [4 5 6] print(直接条件选择:, arr[arr % 2 0]) # [2 4 6] # 花式索引使用整数数组索引 indices [0, 2, 4] print(花式索引选择:, arr[indices]) # [1 3 5] arr_2d np.arange(12).reshape(3, 4) print(选择特定行:, arr_2d[[0, 2]]) # 第0行和第2行 print(选择特定行列:, arr_2d[[0, 2], [1, 3]]) # (0,1) 和 (2,3) 位置的元素 [1 11]9.2 线性代数运算a np.array([[1, 2], [3, 4]]) b np.array([[5, 6], [7, 8]]) # 矩阵乘法 dot_product np.dot(a, b) # 或 a b print(矩阵乘法: , dot_product) # 其他线性代数函数 print(矩阵转置: , a.T) print(矩阵求逆: , np.linalg.inv(a)) # 如果可逆 print(行列式:, np.linalg.det(a)) print(特征值和特征向量:, np.linalg.eig(a))9.3 数组去重与集合运算arr np.array([1, 2, 2, 3, 4, 4, 4, 5]) print(唯一值:, np.unique(arr)) # [1 2 3 4 5] print(值出现次数:, np.bincount(arr)) # 索引对应值出现的次数适用于非负整数 a np.array([1, 2, 3, 4, 5]) b np.array([3, 4, 5, 6, 7]) print(交集:, np.intersect1d(a, b)) # [3 4 5] print(并集:, np.union1d(a, b)) # [1 2 3 4 5 6 7] print(差集 (a-b):, np.setdiff1d(a, b)) # [1 2]参考来源【NumPy】全面解析NumPy的sort函数高效排序算法与应用技巧Python实战用NumPy快速生成12种概率分布随机数附代码numpy.loadtxt() 用法Python-Numpy详解【Python】Numpy库近50个常用函数详解和示例可作为工具手册使用