numpy的基础运算

张开发
2026/6/9 12:54:14 15 分钟阅读
numpy的基础运算
numpy基础运算概述NumPy是Python中用于科学计算的核心库提供高性能的多维数组对象及工具。其基础运算包括数组创建、数学运算、统计运算、线性代数运算等。一、数组创建通过np.array()可从列表或元组创建数组import numpy as np arr np.array([1, 2, 3]) # 一维数组 arr2d np.array([[1, 2], [3, 4]]) # 二维数组特殊数组创建函数np.zeros((2,3)) # 全0数组 np.ones(4) # 全1数组 np.arange(5) # 类似range的数组 np.linspace(0, 1, 5) # 等差数组 np.random.rand(3,2) # 随机数组二、数学运算元素级运算逐元素计算a np.array([1, 2, 3]) b np.array([4, 5, 6]) a b # 加法 [5,7,9] a * b # 乘法 [4,10,18] np.sin(a) # 三角函数 np.exp(a) # 指数广播机制不同形状数组运算a np.array([[1], [2], [3]]) b np.array([4, 5, 6]) a b # 结果形状为(3,3)三、np.sortnp.sort是 NumPy 中用于对数组进行排序的函数。它可以对一维或多维数组进行排序并支持多种排序算法和排序方向。基本语法np.sort(a, axis-1, kindNone, orderNone)a要排序的数组。axis指定排序的轴默认为-1最后一个轴。kind排序算法可选quicksort、mergesort、heapsort或stable。order用于结构化数组指定排序的字段。一维数组排序对一维数组进行升序排序import numpy as np arr np.array([3, 1, 4, 2, 5]) sorted_arr np.sort(arr) print(sorted_arr) # 输出[1 2 3 4 5]多维数组排序对二维数组按行或列排序arr_2d np.array([[3, 1, 4], [2, 5, 0]]) sorted_rows np.sort(arr_2d, axis1) # 按行排序 sorted_cols np.sort(arr_2d, axis0) # 按列排序 print(sorted_rows) # 输出[[1 3 4] [0 2 5]] print(sorted_cols) # 输出[[2 1 0] [3 5 4]]指定排序算法通过kind参数选择排序算法arr np.array([3, 1, 4, 2, 5]) sorted_merge np.sort(arr, kindmergesort) # 使用归并排序 print(sorted_merge) # 输出[1 2 3 4 5]结构化数组排序对结构化数组按字段排序dtype [(name, S10), (age, int)] data np.array([(Alice, 25), (Bob, 20)], dtypedtype) sorted_data np.sort(data, orderage) # 按 age 字段排序 print(sorted_data) # 输出[(bBob, 20) (bAlice, 25)]原地排序与 np.sort 的区别np.sort返回排序后的新数组而ndarray.sort方法会原地修改数组arr np.array([3, 1, 4]) sorted_arr np.sort(arr) # 返回新数组 arr.sort() # 原地排序 print(sorted_arr) # 输出[1 3 4] print(arr) # 输出[1 3 4]四、numpy.diff 函数numpy.diff用于计算数组中元素的离散差分即相邻元素之间的差值。默认沿最后一个轴计算一阶差分。语法numpy.diff(a, n1, axis-1)a输入数组n差分阶数默认为1axis计算差分的轴默认为最后一个轴示例import numpy as np arr np.array([1, 3, 6, 10]) result np.diff(arr) # 输出 [2 3 4]五、numpy.cumsum 函数numpy.cumsum用于计算数组元素的累积和即从第一个元素开始逐步累加的结果。语法numpy.cumsum(a, axisNone, dtypeNone)a输入数组axis计算累积和的轴默认为展平数组dtype返回数组的数据类型示例import numpy as np arr np.array([1, 2, 3, 4]) result np.cumsum(arr) # 输出 [1 3 6 10]两者区别numpy.diff计算相邻元素的差值结果数组长度比输入数组少1。numpy.cumsum计算元素的累积和结果数组长度与输入数组相同。组合使用示例import numpy as np arr np.array([1, 3, 6, 10]) diff_result np.diff(arr) # [2 3 4] cumsum_result np.cumsum(diff_result) # [2 5 9]数学关系对于一维数组x存在以下关系np.cumsum(np.diff(x)) x[0] x[1:]性能考虑numpy.diff的时间复杂度为O(n)numpy.cumsum的时间复杂度同样为O(n)。对于大型数组这两个函数都经过优化性能较好。六、统计运算常用统计函数arr np.random.randn(5,4) arr.mean() # 平均值 arr.sum(axis0) # 沿轴求和 arr.sum(axis1) arr.sum() np.sum(arr,axis0) np.sum(arr,axis1) arr.std() # 标准差 arr.max(axis0) # 最大值 arr.max(axis1) arr.max() np.max(arr,axis0) np.max(arr,axis1) arr.min() # 最小值 np.median(arr) # 中位数七、线性代数运算7.1 矩阵乘法使用或np.dot()A np.array([[1,2], [3,4]]) B np.array([[5,6], [7,8]]) A B # 矩阵乘法 A.dot(B) # 矩阵乘法 np.dot(A,B) # 矩阵乘法7.2 其他线性代数操作np.linalg.inv(A) # 矩阵求逆 np.linalg.eig(A) # 特征值分解 np.linalg.det(A) # 行列式7.3 np.transposenp.transpose是 NumPy 库中的一个函数用于对数组的维度进行转置操作。转置操作通常用于交换数组的行和列或者更一般地交换数组的任意两个维度。对于二维数组矩阵转置操作相当于将矩阵的行和列互换。基本语法np.transpose的基本语法如下numpy.transpose(a, axesNone)a输入的数组。axes可选参数用于指定转置后的维度顺序。如果不提供默认反转所有维度。二维数组的转置对于二维数组np.transpose的效果与矩阵转置相同。例如import numpy as np arr np.array([[1, 2, 3], [4, 5, 6]]) print(Original array:\n, arr) print(Transposed array:\n, np.transpose(arr))输出Original array: [[1 2 3] [4 5 6]] Transposed array: [[1 4] [2 5] [3 6]]高维数组的转置对于高维数组np.transpose可以通过axes参数指定维度的交换顺序。例如对于一个三维数组arr np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) print(Original array shape:, arr.shape) print(Transposed array shape:, np.transpose(arr, (1, 0, 2)).shape)输出Original array shape: (2, 2, 2) Transposed array shape: (2, 2, 2)这里axes(1, 0, 2)表示将第一个和第二个维度交换。使用 axes 参数axes参数是一个整数元组用于指定转置后的维度顺序。例如arr np.array([[[1, 2], [3, 4]], [[5, 6], [7, 8]]]) print(Original array:\n, arr) print(Transposed with axes (2, 0, 1):\n, np.transpose(arr, (2, 0, 1)))输出Original array: [[[1 2] [3 4]] [[5 6] [7 8]]] Transposed with axes (2, 0, 1): [[[1 5] [3 7]] [[2 6] [4 8]]]简化写法对于二维数组可以直接使用.T属性进行转置arr np.array([[1, 2, 3], [4, 5, 6]]) print(Transposed array:\n, arr.T)输出Transposed array: [[1 4] [2 5] [3 6]]应用场景np.transpose在数据处理和科学计算中非常常见例如矩阵运算中需要转置矩阵。调整图像数据的通道顺序如从 HWC 转为 CHW。重新排列高维数组的维度以适应计算需求。注意事项对于一维数组np.transpose不会产生任何效果因为一维数组只有一个维度。转置操作返回的是原数组的视图而不是副本因此修改转置后的数组可能会影响原数组。如果需要副本可以使用.copy()方法。八、索引与切片8.1 基本索引与Python列表类似arr np.arange(10) arr[5] # 索引 arr[2:5] # 切片8.2 布尔索引arr[arr 5] # 选择大于5的元素8.3 花式索引arr[[1,3,5]] # 选择指定索引元素8.4 np.argmin 和 np.argmaxnp.argmin和np.argmax是 NumPy 库中用于查找数组中最小值和最大值索引的函数。它们分别返回数组中最小值和最大值所在位置的索引。np.argmin 的用法np.argmin(a, axisNone, outNone)a输入的数组。axis指定沿哪个轴查找最小值索引。默认为None表示将数组展平后查找。out可选参数用于指定输出的数组。示例代码import numpy as np arr np.array([3, 1, 4, 1, 5, 9]) min_index np.argmin(arr) print(min_index) # 输出: 1多维数组示例arr_2d np.array([[3, 1, 4], [1, 5, 9]]) min_index_axis0 np.argmin(arr_2d, axis0) # 沿轴0查找 min_index_axis1 np.argmin(arr_2d, axis1) # 沿轴1查找 print(min_index_axis0) # 输出: [1 0 0] print(min_index_axis1) # 输出: [1 0]np.argmax 的用法np.argmax(a, axisNone, outNone)a输入的数组。axis指定沿哪个轴查找最大值索引。默认为None表示将数组展平后查找。out可选参数用于指定输出的数组。示例代码import numpy as np arr np.array([3, 1, 4, 1, 5, 9]) max_index np.argmax(arr) print(max_index) # 输出: 5多维数组示例arr_2d np.array([[3, 1, 4], [1, 5, 9]]) max_index_axis0 np.argmax(arr_2d, axis0) # 沿轴0查找 max_index_axis1 np.argmax(arr_2d, axis1) # 沿轴1查找 print(max_index_axis0) # 输出: [0 1 1] print(max_index_axis1) # 输出: [2 2]注意事项平展数组如果不指定axis参数函数会将数组展平为一维数组后查找索引。多个极值如果数组中有多个相同的最小值或最大值函数会返回第一个出现的索引。性能对于大型数组指定axis参数可以提高计算效率。实际应用场景分类任务在机器学习中np.argmax常用于从概率分布中获取预测类别。数据分析查找数据集中最小值或最大值的位置。图像处理定位图像中的极值点。通过合理使用np.argmin和np.argmax可以高效地处理数组中的极值索引问题。九、形状操作改变数组形状arr.reshape(2,5) # 重塑形状 arr.flatten() # 展平数组 arr.T # 转置数组连接np.concatenate([arr1, arr2]) # 连接数组 np.vstack([arr1, arr2]) # 垂直堆叠 np.hstack([arr1, arr2]) # 水平堆叠十、np.clip 函数的基本功能np.clip是 NumPy 提供的函数用于将数组中的元素限制在指定的范围内。超出范围的值会被裁剪到边界值。语法如下np.clip(a, a_min, a_max, outNone)a输入数组。a_min最小值所有小于a_min的值会被替换为a_min。a_max最大值所有大于a_max的值会被替换为a_max。out可选指定输出数组形状需与输入数组一致。10.1 参数说明单边界裁剪可以仅指定a_min或a_max未指定的边界不会生效。例如import numpy as np arr np.array([1, 2, 3, 4, 5]) np.clip(arr, a_min2, a_max4) # 输出 [2, 2, 3, 4, 4]动态边界a_min和a_max可以是标量或与输入数组形状兼容的数组实现逐元素裁剪bounds np.array([1, 2, 1, 3, 5]) np.clip(arr, a_minbounds, a_max4) # 输出 [1, 2, 3, 4, 4]10.2 应用示例处理图像像素值将像素值限制在 0 到 255 范围内image_data np.random.randint(-10, 300, size(100, 100)) normalized_image np.clip(image_data, 0, 255)防止数值溢出在数学计算中避免极端值x np.array([1e10, -1e10, 0.5]) safe_x np.clip(x, -1e5, 1e5) # 限制在 [-1e5, 1e5]10.3 注意事项如果a_min a_max所有值会被设置为a_max逻辑以a_max优先。输入数组可以是任意形状输出形状与输入一致。支持NaN处理但NaN值不会被裁剪保留原值。10.4 性能优化对于大数组可通过预分配输出内存out参数减少重复内存分配result np.empty_like(arr) np.clip(arr, 2, 4, outresult)

更多文章