news 2026/3/26 17:20:17

爬虫与数据分析/可视化:使用NumPy进行数值计算【爬虫中级篇】

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
爬虫与数据分析/可视化:使用NumPy进行数值计算【爬虫中级篇】

爬虫与数据分析/可视化:使用NumPy进行数值计算【爬虫中级篇】

前言

NumPy是Python的一个科学计算库,提供了高效的多维数组操作和数学函数。本文将详细介绍如何使用NumPy进行数值计算,特别是在爬虫数据分析中的应用。

NumPy简介

什么是NumPy

NumPy是Python的一个科学计算库,提供了高效的多维数组操作和数学函数。

NumPy的特点

  • 高效的多维数组:提供了高效的多维数组对象
  • 丰富的数学函数:提供了丰富的数学函数
  • 广播机制:支持广播机制
  • C语言实现:底层使用C语言实现,性能高

安装NumPy

# 安装NumPypipinstallnumpy# 验证安装python -c"import numpy as np; print(np.__version__)"

基本操作

1. 创建数组

importnumpyasnp# 创建一维数组arr1=np.array([1,2,3,4,5])print(arr1)# 创建二维数组arr2=np.array([[1,2,3],[4,5,6]])print(arr2)# 创建全零数组arr_zero=np.zeros((3,4))print(arr_zero)# 创建全一数组arr_one=np.ones((3,4))print(arr_one)# 创建单位矩阵arr_eye=np.eye(3)print(arr_eye)# 创建等差数列arr_range=np.arange(0,10,2)print(arr_range)# 创建等间隔数组arr_linspace=np.linspace(0,10,5)print(arr_linspace)

2. 数组属性

importnumpyasnp arr=np.array([[1,2,3],[4,5,6]])# 形状print(arr.shape)# 维度print(arr.ndim)# 元素个数print(arr.size)# 数据类型print(arr.dtype)# 元素大小print(arr.itemsize)

3. 数组操作

importnumpyasnp arr1=np.array([1,2,3])arr2=np.array([4,5,6])# 数组加法print(arr1+arr2)# 数组减法print(arr1-arr2)# 数组乘法print(arr1*arr2)# 数组除法print(arr1/arr2)# 数组平方print(arr1**2)# 数组转置arr=np.array([[1,2,3],[4,5,6]])print(arr.T)# 数组重塑arr=np.array([1,2,3,4,5,6])print(arr.reshape(2,3))# 数组展平arr=np.array([[1,2,3],[4,5,6]])print(arr.flatten())

4. 索引和切片

importnumpyasnp arr=np.array([[1,2,3],[4,5,6],[7,8,9]])# 索引print(arr[0,0])print(arr[1,2])# 切片print(arr[0:2,0:2])print(arr[:,1:])print(arr[1:,:])# 布尔索引print(arr[arr>5])# 整数索引print(arr[[0,1],[0,2]])

数学函数

1. 基本数学函数

importnumpyasnp arr=np.array([1,2,3,4,5])# 平方根print(np.sqrt(arr))# 指数print(np.exp(arr))# 对数print(np.log(arr))print(np.log10(arr))# 三角函数print(np.sin(arr))print(np.cos(arr))print(np.tan(arr))# 绝对值print(np.abs(arr))# 取整print(np.floor(arr))print(np.ceil(arr))print(np.round(arr))

2. 统计函数

importnumpyasnp arr=np.array([1,2,3,4,5])# 求和print(np.sum(arr))# 求平均值print(np.mean(arr))# 求中位数print(np.median(arr))# 求标准差print(np.std(arr))# 求方差print(np.var(arr))# 求最大值print(np.max(arr))# 求最小值print(np.min(arr))# 求最大值索引print(np.argmax(arr))# 求最小值索引print(np.argmin(arr))# 求累积和print(np.cumsum(arr))# 求累积积print(np.cumprod(arr))

3. 线性代数

importnumpyasnp# 矩阵乘法arr1=np.array([[1,2],[3,4]])arr2=np.array([[5,6],[7,8]])print(np.dot(arr1,arr2))# 矩阵转置print(arr1.T)# 矩阵求逆print(np.linalg.inv(arr1))# 矩阵求行列式print(np.linalg.det(arr1))# 矩阵特征值和特征向量print(np.linalg.eig(arr1))# 解线性方程组A=np.array([[1,2],[3,4]])b=np.array([5,6])print(np.linalg.solve(A,b))

爬虫数据分析应用

1. 数据预处理

importnumpyasnpimportpandasaspd# 读取数据df=pd.read_csv('data.csv')# 转换为NumPy数组data=df.values# 缺失值处理data[np.isnan(data)]=0# 异常值处理mean=np.mean(data)std=np.std(data)data=np.clip(data,mean-3*std,mean+3*std)# 数据标准化data=(data-np.mean(data))/np.std(data)# 数据归一化data=(data-np.min(data))/(np.max(data)-np.min(data))print(data)

2. 数据统计分析

importnumpyasnpimportpandasaspd# 读取数据df=pd.read_csv('data.csv')# 转换为NumPy数组data=df.values# 基本统计print('均值:',np.mean(data))print('中位数:',np.median(data))print('标准差:',np.std(data))print('最大值:',np.max(data))print('最小值:',np.min(data))# 相关性分析corr_matrix=np.corrcoef(data.T)print('相关系数矩阵:')print(corr_matrix)# 协方差分析cov_matrix=np.cov(data.T)print('协方差矩阵:')print(cov_matrix)# 分位数分析print('25%分位数:',np.percentile(data,25))print('50%分位数:',np.percentile(data,50))print('75%分位数:',np.percentile(data,75))

3. 数据可视化

importnumpyasnpimportmatplotlib.pyplotasplt# 生成数据x=np.linspace(0,10,100)y=np.sin(x)# 绘制折线图plt.plot(x,y)plt.title('Sine Wave')plt.xlabel('x')plt.ylabel('y')plt.show()# 生成随机数据data=np.random.normal(0,1,1000)# 绘制直方图plt.hist(data,bins=30)plt.title('Histogram')plt.xlabel('Value')plt.ylabel('Frequency')plt.show()# 生成二维数据x=np.random.normal(0,1,1000)y=np.random.normal(0,1,1000)# 绘制散点图plt.scatter(x,y)plt.title('Scatter Plot')plt.xlabel('x')plt.ylabel('y')plt.show()

实战示例

示例1:分析爬虫请求时间

importnumpyasnpimportpandasaspdimportmatplotlib.pyplotasplt# 模拟爬虫请求时间数据times=np.random.normal(1,0.5,1000)times=np.clip(times,0,None)# 基本统计print('请求时间统计:')print('均值:',np.mean(times))print('中位数:',np.median(times))print('标准差:',np.std(times))print('最大值:',np.max(times))print('最小值:',np.min(times))# 分位数分析print('分位数分析:')print('25%分位数:',np.percentile(times,25))print('50%分位数:',np.percentile(times,50))print('75%分位数:',np.percentile(times,75))print('90%分位数:',np.percentile(times,90))print('95%分位数:',np.percentile(times,95))print('99%分位数:',np.percentile(times,99))# 绘制直方图plt.hist(times,bins=30)plt.title('Request Time Distribution')plt.xlabel('Time (seconds)')plt.ylabel('Frequency')plt.show()# 绘制箱线图plt.boxplot(times)plt.title('Request Time Box Plot')plt.ylabel('Time (seconds)')plt.show()

示例2:分析爬虫数据量

importnumpyasnpimportpandasaspdimportmatplotlib.pyplotasplt# 模拟爬虫数据量数据# 假设每天爬取的数据量daily_data=np.random.poisson(1000,30)# 基本统计print('每日数据量统计:')print('均值:',np.mean(daily_data))print('中位数:',np.median(daily_data))print('标准差:',np.std(daily_data))print('最大值:',np.max(daily_data))print('最小值:',np.min(daily_data))print('总和:',np.sum(daily_data))# 累积和cumulative_data=np.cumsum(daily_data)print('累积数据量:')print(cumulative_data)# 绘制折线图plt.plot(daily_data)plt.title('Daily Data Volume')plt.xlabel('Day')plt.ylabel('Data Volume')plt.show()# 绘制累积和图plt.plot(cumulative_data)plt.title('Cumulative Data Volume')plt.xlabel('Day')plt.ylabel('Cumulative Data Volume')plt.show()

示例3:分析爬虫成功率

importnumpyasnpimportpandasaspdimportmatplotlib.pyplotasplt# 模拟爬虫成功率数据# 假设每次请求的成功率success_rates=np.random.binomial(1,0.9,1000)# 基本统计print('请求成功率统计:')print('总请求数:',len(success_rates))print('成功请求数:',np.sum(success_rates))print('失败请求数:',len(success_rates)-np.sum(success_rates))print('成功率:',np.mean(success_rates)*100,'%')# 按时间段分析# 假设每100次请求为一个时间段periods=10period_success=np.array_split(success_rates,periods)period_success_rates=[np.mean(period)*100forperiodinperiod_success]print('各时间段成功率:')fori,rateinenumerate(period_success_rates):print(f'时间段{i+1}:{rate:.2f}%')# 绘制柱状图plt.bar(range(1,periods+1),period_success_rates)plt.title('Success Rate by Period')plt.xlabel('Period')plt.ylabel('Success Rate (%)')plt.ylim(0,100)plt.show()

高级功能

1. 广播机制

importnumpyasnp# 广播机制arr1=np.array([[1,2,3],[4,5,6]])arr2=np.array([10,20,30])print(arr1+arr2)# 广播机制应用arr=np.array([[1,2,3],[4,5,6]])mean=np.mean(arr,axis=0)std=np.std(arr,axis=0)print((arr-mean)/std)

2. 向量化操作

importnumpyasnp# 向量化操作arr=np.array([1,2,3,4,5])# 传统循环result=[]forxinarr:result.append(x*2)print(result)# 向量化操作result=arr*2print(result)# 向量化函数deffunc(x):returnx*2+1vectorized_func=np.vectorize(func)result=vectorized_func(arr)print(result)

3. 内存映射

importnumpyasnp# 创建内存映射文件shape=(1000,1000)dtype=np.float32 fp=np.memmap('large_array.dat',dtype=dtype,mode='w+',shape=shape)# 写入数据fp[:]=np.random.rand(*shape)# 读取数据print(fp.mean())# 关闭内存映射fp.flush()delfp# 重新打开内存映射fp=np.memmap('large_array.dat',dtype=dtype,mode='r',shape=shape)print(fp.mean())delfp

最佳实践

  1. 使用向量化操作:尽量使用向量化操作代替循环
  2. 使用广播机制:合理使用广播机制
  3. 注意数据类型:选择合适的数据类型
  4. 内存管理:注意内存管理,特别是处理大型数组时
  5. 使用NumPy函数:尽量使用NumPy内置函数

注意事项

  1. 内存限制:注意内存限制,处理大型数组时可能需要使用内存映射
  2. 数据类型:选择合适的数据类型,避免内存浪费
  3. 计算精度:注意计算精度问题
  4. 性能优化:合理使用NumPy的优化功能

总结

NumPy是Python的一个科学计算库,提供了高效的多维数组操作和数学函数。本文介绍了NumPy的基本操作、数学函数、爬虫数据分析应用、实战示例、高级功能以及最佳实践。

在实际开发中,建议使用向量化操作代替循环、合理使用广播机制、选择合适的数据类型、注意内存管理、尽量使用NumPy内置函数。同时要注意内存限制、计算精度、性能优化等问题。

NumPy在爬虫数据分析中有着广泛的应用,可以用于数据预处理、数据统计分析、数据可视化等方面。通过合理使用NumPy,可以大大提高数据分析的效率和准确性。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/23 5:45:34

Yi-Coder-1.5B在Visio流程图设计中的智能辅助

Yi-Coder-1.5B在Visio流程图设计中的智能辅助 1. 当系统分析师面对流程图设计的日常挑战 你是否经历过这样的场景:刚开完需求评审会,产品经理甩过来一长串业务逻辑描述,要求当天就输出标准Visio流程图?或者架构设计阶段&#xf…

作者头像 李华
网站建设 2026/3/18 5:15:04

SmallThinker-3B实战入门:作为QwQ-32B草稿模型的70%加速方案详解

SmallThinker-3B实战入门:作为QwQ-32B草稿模型的70%加速方案详解 最近在玩大模型推理加速,发现了一个挺有意思的小家伙——SmallThinker-3B-Preview。你可能听说过那些动辄几十上百亿参数的大模型,推理起来慢吞吞的,但这个小模型…

作者头像 李华
网站建设 2026/3/25 5:34:24

4阶段突破语言壁垒:设计师必备的Axure本地化指南

4阶段突破语言壁垒:设计师必备的Axure本地化指南 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包,不定期更新。支持 Axure 9、Axure 10。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn 你是否…

作者头像 李华