资讯动态

《利用Python进行数据分析》第一天:Numpy入门

发布时间:2026/10/20 1:55:21 来源:尧图企业网站定制
NumPy入门基于 Wes McKinney《利用 Python 进行数据分析》中 NumPy 入门部分整理。一、Numpy的ndarray一种多维数组对象1.1 概念NumPy 的核心是ndarray即 N 维数组对象。它是一种同构数据容器也就是说数组中的所有元素必须是相同类型的。每个数组都有以下重要属性shape形状表示各维度的大小例如(2, 3)表示 2 行 3 列。dtype数据类型例如int64、float64。ndim维度数例如二维数组的ndim为 2。与 Python 列表相比ndarray将数据存储在连续内存块中支持向量化运算因此计算速度更快、内存占用更低。importnumpyasnp arrnp.array([[1,2,3],[4,5,6]])print(arr.shape)# (2, 3)print(arr.ndim)# 2print(arr.dtype)# int641.2 创建ndarray创建数组的常用方法包括np.array从列表或元组创建数组。np.zeros创建全 0 数组。np.ones创建全 1 数组。np.empty创建未初始化的数组。np.arange类似 Python 的range返回数组。np.linspace创建等间隔数组。np.eye/np.identity创建单位矩阵。np.full创建填充指定值的数组。importnumpyasnp arr1np.array([1,2,3])arr2np.array([[1,2,3],[4,5,6]])arr3np.array([1,2,3],dtypenp.float64)np.zeros(10)np.zeros((3,6))np.ones((2,4))np.empty((2,3,2))# 内容未初始化不应依赖其值np.arange(15)np.linspace(0,2,9)# 0 到 2 之间 9 个等距点np.eye(3)# 3x3 单位矩阵np.full((2,2),7)# 指定值填充1.3 ndarray的数据类型NumPy 提供比 Python 更丰富的数据类型常见的有整数int8、int16、int32、int64、uint8等。浮点数float16、float32、float64。复数complex64、complex128。布尔值bool。对象object。字符串string_、unicode_。创建数组时NumPy 会自动推断数据类型如果输入中混合了不同类型会发生向上转型例如整数和浮点数混合会得到浮点数组。importnumpyasnp arrnp.array([1,2,3])print(arr.dtype)# int64float_arrnp.array([1,2.5,3])print(float_arr.dtype)# float64# 使用 astype 显式转换arr.astype(np.float32)arr.astype(np.int8)# 字符串转数值numeric_stringsnp.array([1.25,-9.6,42])numeric_strings.astype(np.float64)astype会返回一个新数组原数组不会被修改。1.4 数组和标量之间的运算数组与标量进行算术运算时运算会逐元素传播即标量与数组中的每个元素进行运算。这种机制称为广播。运算结果会生成新数组原数组保持不变。arrnp.array([[1.,2.,3.],[4.,5.,6.]])arr2arr*21/arr arr**2arr3arr2形状相同的数组之间也可以进行逐元素运算anp.array([1,2,3])bnp.array([4,5,6])ab a*b1.5 基本的索引和切片一维数组的索引和切片方式与 Python 列表类似但有一个重要区别NumPy 数组的切片是原数组的视图修改切片会影响原数组。arrnp.arange(10)arr[5]# 5arr[5:8]# array([5, 6, 7])arr_slicearr[5:8]arr_slice[1]12345print(arr)# array([0, 1, 2, 3, 4, 5, 12345, 7, 8, 9])多维数组使用逗号分隔各维度的索引arr2dnp.array([[1,2,3],[4,5,6],[7,8,9]])arr2d[0,2]# 第 1 行第 3 列3arr2d[0][2]# 等价写法arr2d[:2,1:]# 前两行第 2 列及以后arr2d[1]# 第 2 行array([4, 5, 6])arr2d[:,1]# 第 2 列array([2, 5, 8])arr2d[:,:1]# 第一列构成的二维数组需要注意的是普通切片返回视图而布尔索引和花式索引返回的是副本。二、通用函数快速的元素级数组函数2.1 概念通用函数即ufunc是对ndarray中的每个元素执行运算的向量化函数。它们通常用 C 实现比 Python 循环快很多。通用函数分为一元函数和二元函数一元函数abs、sqrt、square、exp、log、sin、cos、floor、ceil、isnan等。二元函数add、subtract、multiply、divide、power、maximum、minimum、mod、logical_and等。importnumpyasnp arrnp.arange(10)np.sqrt(arr)np.exp(arr)xnp.array([-1.5,4.2,3.0])np.abs(x)np.floor(x)np.ceil(x)# 二元通用函数np.add(x,x)np.multiply(x,2)np.maximum(x,0)# 逐元素取最大值部分通用函数支持out参数可以将结果写入指定数组resultnp.empty_like(arr)np.sqrt(arr,outresult)三、利用数组进行数据处理3.1 概念NumPy 数组非常适合批量数据处理。通过向量化表达式、条件逻辑、聚合统计、排序和集合运算可以用简洁的代码完成数据转换同时避免显式 Python 循环。3.2 将条件逻辑表述为数组运算np.where(condition, x, y)是三元表达式x if condition else y的向量化版本。当condition为True时取x中对应元素否则取y中对应元素。xarrnp.array([1.1,1.2,1.3,1.4,1.5])yarrnp.array([2.1,2.2,2.3,2.4,2.5])condnp.array([True,False,True,True,False])resultnp.where(cond,xarr,yarr)# array([1.1, 2.2, 1.3, 1.4, 2.5])# x 和 y 也可以是标量np.where(cond,1,-1)# 可以嵌套使用np.where(cond,1,np.where(cond2,2,3))典型应用arrnp.random.randn(4,4)np.where(arr0,1,-1)3.3 数学和统计方法数组对象以及np命名空间提供了常用的聚合方法常见统计sum、mean、std、var、min、max。位置索引argmin、argmax。累计计算cumsum、cumprod。可以通过axis参数指定沿哪个轴计算。arrnp.random.randn(5,4)arr.mean()arr.sum()arr.mean(axis0)# 对每一列求均值arr.sum(axis1)# 对每一行求和arr.cumsum(axis1)# 沿行方向累计求和arr.argmax()# 整个数组最大值的一维索引3.4 用于布尔型数组的方法布尔数组的sum方法可以计算True的个数any检查是否至少有一个Trueall检查是否全部为True。bool_arrnp.array([True,False,True,True])bool_arr.sum()# 3bool_arr.any()# Truebool_arr.all()# Falsearrnp.random.randn(100)(arr0).sum()# 正数个数(arr0).any()# 是否存在正数(arr0).all()# 是否全部为正数非布尔数组调用any或all时非零元素会被视为True。3.5 排序np.sort(arr)返回排序后的副本。arr.sort()原地排序。多维数组可以指定axis。argsort返回排序后的索引顺序。arrnp.random.randn(6)sorted_arrnp.sort(arr)arr.sort()# 原地排序arr2dnp.random.randn(5,3)np.sort(arr2d,axis0)# 按列排序idxarr2d[:,0].argsort()arr2d[idx]# 按第一列排序整个数组3.6 唯一化以及其他的集合逻辑np.unique返回排序后的唯一值。np.in1d/np.isin判断元素是否在另一数组中。集合运算np.intersect1d、np.union1d、np.setdiff1d、np.setxor1d。namesnp.array([Bob,Joe,Will,Bob,Will,Joe,Joe])np.unique(names)# array([Bob, Joe, Will])valuesnp.array([6,0,0,3,2,5,6])np.in1d(values,[2,3,6])np.isin(values,[2,3,6])# 新名称推荐使用np.intersect1d([1,2,3],[2,3,4])np.union1d([1,2,3],[2,3,4])np.setdiff1d([1,2,3],[2,3,4])四、用于数组的文件输入输出4.1 将数组以二进制格式保存到磁盘NumPy 提供了高效的二进制格式.npy和.npznp.save(filename, arr)保存单个数组生成.npy文件。np.load(filename.npy)读取数组。np.savez(archive.npz, aarr1, barr2)保存多个数组。np.load(archive.npz)返回类似字典的对象通过键访问数组。np.savez_compressed保存为压缩格式。二进制格式的优点是速度快能够保留数据类型和形状适合 NumPy 数组之间的数据交换。arrnp.arange(10)np.save(some_array,arr)loadednp.load(some_array.npy)np.savez(array_archive.npz,aarr,barr)archnp.load(array_archive.npz)arch[a]4.2 存取文本文件常用的文本文件处理函数np.loadtxt读取简单 CSV 或文本文件。np.genfromtxt功能更强大可以处理缺失值。np.savetxt将数组写入文本文件。arrnp.loadtxt(array_ex.txt,delimiter,)arrnp.genfromtxt(array_ex.txt,delimiter,,filling_values0)np.savetxt(array_out.txt,arr,delimiter,,fmt%.2f)常用参数delimiter指定分隔符。skiprows跳过前几行。usecols读取指定列。filling_values填充缺失值。fmt输出格式。对于复杂的文本数据建议使用 pandas 的read_csv。五、线性代数NumPy 提供了矩阵乘法dot以及numpy.linalg线性代数模块。x.dot(y)、np.dot(x, y)或 Python 3.5 的运算符矩阵乘法。numpy.linalg包含inv、det、eig、qr、svd、solve、lstsq、norm等。importnumpyasnp xnp.array([[1.,2.,3.],[4.,5.,6.]])ynp.array([[6.,23.],[-1.,7.],[8.,9.]])x.dot(y)# 2x3 点乘 3x2 - 2x2np.dot(x,y)x y# 等价写法fromnumpy.linalgimportinv,qr,eig,solve Xnp.random.randn(5,5)matX.T.dot(X)# 对称半正定矩阵inv_matinv(mat)mat.dot(inv_mat)# 近似单位矩阵q,rqr(mat)eigenvalues,eigenvectorseig(mat)Anp.array([[3,1],[1,2]])bnp.array([9,8])solve(A,b)注意*是逐元素乘法不是矩阵乘法。六、随机数生成NumPy 的random模块能够高效生成数组形式的随机数。传统全局 API 使用np.random.seed控制随机种子np.random.rand生成[0, 1)均匀分布随机数。np.random.randn生成标准正态分布随机数。np.random.randint生成随机整数。np.random.normal生成指定均值和标准差的正态分布随机数。np.random.permutation/shuffle排列或洗牌。np.random.choice随机抽样。np.random.seed(123)np.random.rand(2,3)np.random.randn(2,3)np.random.randint(0,10,size(2,3))np.random.normal(loc0,scale1,size(2,3))np.random.permutation(np.arange(10))arrnp.arange(10)np.random.shuffle(arr)np.random.choice([a,b,c],size10,p[0.5,0.3,0.2])推荐使用新版GeneratorAPI即np.random.default_rng它避免了全局状态更加现代rngnp.random.default_rng(123)rng.standard_normal((2,3))rng.integers(0,10,size5)rng.choice([a,b,c],size10,p[0.5,0.3,0.2])McKinney 书中的示例多使用传统 API新代码建议优先使用default_rng。七、范例随机漫步随机漫步是从 0 出发每一步以等概率1或-1的过程。可以用 NumPy 避免 Python 循环。纯 Python 实现importrandom position0walk[position]steps1000foriinrange(steps):step1ifrandom.randint(0,1)else-1positionstep walk.append(position)NumPy 向量化实现importnumpyasnp nsteps1000drawsnp.random.randint(0,2,sizensteps)# 0 或 1stepsnp.where(draws0,1,-1)# 转为 1 或 -1walksteps.cumsum()# 累计求和得到位置print(walk.min(),walk.max())# 第一次达到 10 或 -10 的时刻(np.abs(walk)10).argmax()一次模拟多次随机漫步nwalks5000nsteps1000drawsnp.random.randint(0,2,size(nwalks,nsteps))stepsnp.where(draws0,1,-1)walkssteps.cumsum(axis1)hits30(np.abs(walks)30).any(axis1)hits30.sum()# 达到 30 的模拟次数crossing_times(np.abs(walks[hits30])30).argmax(axis1)crossing_times.mean()解释cumsum(axis1)沿每行累计求和。any(axis1)检查每行是否存在达到 30 的值。argmax(axis1)沿行返回第一个True的位置即首次达到 30 的步数。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑