ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

NumPy完整学习笔记:ndarray数组详解、创建、索引切片、常用函数与运算

2026/8/20 19:38:32 拓冰建站 浏览量
NumPy完整学习笔记:ndarray数组详解、创建、索引切片、常用函数与运算 目录一、什么是NumPy二、ndarray的限制三、ndarray的属性四、ndarray的创建方式4.1 array() - 基于Python列表/元组创建4.2 zeros()、ones()与zeros_like()、ones_like()4.3 full()与full_like()4.4 arange() - 数值范围生成数组4.5 创建随机数数组五、ndarray的数据类型六、ndarray切片和索引6.1 一维数组索引切片6.2 二维数组索引切片6.3 布尔索引6.4 花式索引七、NumPy常用函数7.1 基本数学函数7.2 统计函数7.3 比较函数7.4 排序函数7.5 去重函数8.1 算术运算逐元素8.2 矩阵乘法8.3 广播机制八、总结CSDN标签#Numpy#Python数据分析#ndarray#科学计算摘要NumPy是Python数据分析的底层核心库提供高性能多维数组对象ndarray。本文系统讲解ndarray限制、属性、多种数组创建方式、数据类型、切片索引、各类常用函数以及数组基础运算附带可直接运行代码示例适合数据分析入门学习查阅。一、什么是NumPyNumPyNumerical Python是Python科学计算的基础库。核心对象ndarrayN‑dimensional array多维数组用来存储同类型大量数值数据。优势底层C语言实现运算速度远快于Python原生列表占用内存更小支持向量化运算不需要写循环应用Pandas、Matplotlib、机器学习库底层都依赖NumPy。安装pipinstallnumpy导入约定几乎所有代码都这样写importnumpyasnp二、ndarray的限制ndarray 和 Python list 最大区别数组内所有元素必须是同一个数据类型。列表可以同时放数字、字符串、对象ndarray不允许。如果传入不同类型会自动向上强制转换。importnumpyasnp arrnp.array([1,2,3])print(arr)# 全部变成字符串类型# 输出[1 2 3]维度固定创建之后不能直接增减元素。原生list可以append动态增加ndarray扩容需要生成新数组。多维数组要求每一层维度长度一致不能是参差不齐的“锯齿数组”。坑点传入参差不齐列表不会报错但数组类型变成object性能会退化到普通Python列表失去numpy速度优势。# 不推荐锯齿数组bad_arrnp.array([[1,2],[3]])print(bad_arr)# [list([1, 2]) list([3])]print(bad_arr.dtype)# object三、ndarray的属性创建数组后常用属性获取数组信息属性说明arr.ndim数组维度1维/2维/3维arr.shape元组每个维度的长度如(3,4)代表3行4列arr.size数组总元素个数arr.dtype数组元素的数据类型arr.itemsize单个元素占用字节大小示例代码importnumpyasnp arrnp.array([[1,2,3],[4,5,6]])print(arr.ndim)# 2print(arr.shape)# (2, 3)print(arr.size)# 6print(arr.dtype)# int64print(arr.itemsize)# 8四、ndarray的创建方式4.1 array() - 基于Python列表/元组创建importnumpyasnp# 一维数组a1np.array([1,2,3,4])# 二维数组a2np.array([[1,2],[3,4]])# 指定数据类型a3np.array([1,2,3],dtypenp.float32)print(一维数组:,a1)print(二维数组:,a2)print(指定float32类型:,a3)4.2 zeros()、ones()与zeros_like()、ones_like()zeros(shape)创建全0数组ones(shape)创建全1数组zeros_like(arr)参照传入数组的shape生成同样形状全0数组ones_like(arr)参照传入数组的shape生成同样形状全1数组importnumpyasnp z1np.zeros((2,3))# 2行3列全0o1np.ones((3,2))# 3行2列全1tmpnp.array([[1,2,3],[4,5,6]])z_likenp.zeros_like(tmp)# 形状同tmp全0o_likenp.ones_like(tmp)# 形状同tmp全1print(zeros:,z1)print(zeros_like:,z_like)print(ones:,o1)print(ones_like:,o_like)4.3 full()与full_like()创建全部填充指定数值的数组。full(shape, fill_value)指定形状全部赋值fill_valuefull_like(arr, fill_value)复制传入数组shape全部赋值fill_valueimportnumpyasnp f1np.full((2,3),8)# 2行3列全部填充8temp_arrnp.array([[1,2],[3,4]])f_likenp.full_like(temp_arr,10)# 形状同temp_arr全部填充10print(full:,f1)print(full_like:,f_like)4.4 arange() - 数值范围生成数组类似python内置range但是返回ndarray支持浮点数。np.arange(start, stop, step)左闭右开区间。importnumpyasnp a1np.arange(10)# 0‑9a2np.arange(2,10,2)# 2, 4, 6, 8a3np.arange(0,2,0.3)# 支持浮点数步长print(0-9:,a1)print(2-10步长2:,a2)print(0-2步长0.3:,a3)注意浮点数arange因为精度问题不建议做精确终止均匀采样优先使用np.linspace()。4.5 创建随机数数组importnumpyasnp# 设置随机种子保证每次运行结果相同np.random.seed(10)# 0‑1之间均匀分布随机数r1np.random.rand(2,3)# 标准正态分布(均值0方差1)r2np.random.randn(3,3)# 指定区间整数 [low, high)r3np.random.randint(0,10,size(2,2))print(均匀分布:,r1)print(标准正态分布:,r2)print(随机整数:,r3)五、ndarray的数据类型常用dtype整数int8、int16、int32、int64浮点数float16、float32、float64布尔bool字符串str_创建数组指定dtypearrnp.array([1,2,3],dtypenp.float32)print(arr.dtype)# float32类型转换使用.astype()返回新数组不会修改原数组。arrnp.array([1.1,2.2,3.3])arr2arr.astype(np.int32)# 浮点数转整数print(原数组:,arr)print(转换后:,arr2)# [1 2 3]print(原数组不变:,arr)# [1.1 2.2 3.3]⚠️ 注意astype返回新数组原数组不变浮点数转整数直接截断小数不是四舍五入。六、ndarray切片和索引重要特性numpy切片返回视图view修改切片会影响原数组这和Python列表切片拷贝不一样想要独立副本需要调用.copy()。6.1 一维数组索引切片importnumpyasnp arrnp.array([0,1,2,3,4,5])print(arr[2])# 索引取值: 2print(arr[1:4])# 切片 [1, 2, 3]print(arr[::2])# 步长2: [0, 2, 4]print(arr[-1])# 最后一个元素: 56.2 二维数组索引切片格式arr[行, 列]arr2dnp.array([[1,2,3],[4,5,6],[7,8,9]])print(arr2d[0,1])# 第0行第1列: 2print(arr2d[0:2,:])# 前两行全部列print(arr2d[:,1])# 全部行第1列: [2 5 8]print(arr2d[1:,0:2])# 第1行到最后第0列到第1列6.3 布尔索引arr2dnp.array([[1,2,3],[4,5,6],[7,8,9]])condarr2d3print(条件数组:,cond)print(满足条件的元素:,arr2d[cond])# [4 5 6 7 8 9]6.4 花式索引arr2dnp.array([[1,2,3],[4,5,6],[7,8,9]])print(arr2d[[0,2]])# 取第0行、第2行print(arr2d[:,[0,2]])# 取第0列、第2列重点切片得到视图修改会改原数组arr_slice arr[1:3].copy()创建独立副本。七、NumPy常用函数7.1 基本数学函数importnumpyasnp arrnp.array([1,4,9,16])print(平方根:,np.sqrt(arr))# [1. 2. 3. 4.]print(平方:,np.square(arr))# [1 16 81 256]print(e的x次方:,np.exp(arr))# [2.71828183e00 5.45981500e01 8.10308393e03 8.88611052e06]print(自然对数:,np.log(arr))# [0. 1.38629436 2.19722458 2.77258872]print(正弦:,np.sin(arr))# [0.84147098 -0.7568025 0.41211849 -0.28790332]print(余弦:,np.cos(arr))# [0.54030231 -0.65364362 -0.91113026 -0.95765948]print(绝对值:,np.abs([-1,-2,3]))# [1 2 3]7.2 统计函数可指定axis按行/按列计算axis0按列axis1按行。arrnp.array([[1,2,3],[4,5,6]])print(全部求和:,np.sum(arr))# 21print(按列求和:,np.sum(arr,axis0))# [5 7 9]print(按行求和:,np.sum(arr,axis1))# [6 15]print(均值:,np.mean(arr))# 3.5print(最大值:,np.max(arr))# 6print(最小值:,np.min(arr))# 1print(标准差:,np.std(arr))# 1.707825127659933print(方差:,np.var(arr))# 2.9166666666666665print(中位数:,np.median(arr))# 3.57.3 比较函数逐元素比较返回布尔数组。arrnp.array([1,3,5,7])resarr4print(大于4:,res)# [False False True True]# where条件判断resultnp.where(arr4,10,0)# 条件成立赋值10否则0print(where结果:,result)# [0 0 10 10]7.4 排序函数arrnp.array([3,1,4,2])# np.sort 返回排序后的新数组不改变原数组snp.sort(arr)print(排序后:,s)# [1 2 3 4]print(原数组:,arr)# [3 1 4 2]# arr.sort() 原地修改原数组arr.sort()print(原地排序后:,arr)# [1 2 3 4]# 二维数组指定axis排序arr2dnp.array([[3,1],[2,5]])print(按行排序:,np.sort(arr2d,axis1))# [[1 3] [2 5]]print(按列排序:,np.sort(arr2d,axis0))# [[2 1] [3 5]]7.5 去重函数np.unique()返回数组去重后排序结果。arrnp.array([1,2,2,3,3,3])unp.unique(arr)print(u)8. 基本运算numpy支持向量化运算不需要循环数组与标量、数组与数组直接运算符计算。8.1 算术运算逐元素importnumpyasnp anp.array([1,2,3,4])bnp.array([5,6,7,8])print(加法:,ab)# [ 6 8 10 12]print(减法:,a-b)# [-4 -4 -4 -4]print(乘法:,a*b)# [ 5 12 21 32]print(除法:,a/b)# [0.2 0.33333333 0.42857143 0.5]print(幂运算:,a**2)# [ 1 4 9 16]8.2 矩阵乘法# 一维数组点积anp.array([1,2,3])bnp.array([4,5,6])print(点积:,np.dot(a,b))# 32# 二维数组矩阵乘法Anp.array([[1,2],[3,4]])Bnp.array([[5,6],[7,8]])print(矩阵乘法:,np.matmul(A,B))# [[19 22] [43 50]]print(等价写法:,A B)# [[19 22] [43 50]]8.3 广播机制当数组形状不同时NumPy会自动扩展较小数组来匹配较大数组的形状。# 标量与数组运算arrnp.array([[1,2,3],[4,5,6]])print(数组加标量:,arr10)# 不同形状数组运算anp.array([[1,2,3],[4,5,6]])bnp.array([10,20,30])print(广播加法:,ab)# b被广播到a的每一行八、总结NumPy的ndarray是Python科学计算的基石掌握其核心特性对数据分析、机器学习至关重要高效性C语言底层实现向量化运算避免循环一致性数组元素类型必须相同维度固定丰富创建方式array、zeros、ones、arange、随机数等灵活索引支持切片、布尔索引、花式索引视图机制切片返回视图修改会影响原数组需要时使用.copy()丰富函数库数学、统计、排序等函数齐全广播机制简化不同形状数组的运算建议读者在实际项目中多练习这些操作结合Pandas、Matplotlib等库构建完整的数据分析工作流。# 综合示例创建数组并计算统计信息importnumpyasnp# 创建随机数据datanp.random.randn(100,5)# 100行5列标准正态分布数据# 计算每列的统计量print(每列均值:,np.mean(data,axis0))print(每列标准差:,np.std(data,axis0))print(每列最大值:,np.max(data,axis0))print(每列最小值:,np.min(data,axis0))# 数据标准化meannp.mean(data,axis0)stdnp.std(data,axis0)normalized_data(data-mean)/stdprint(标准化后数据形状:,normalized_data.shape)