ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

机器学习入门必备:numpy、pandas、matplotlib三件套实操

机器学习入门必备:numpy、pandas、matplotlib三件套实操 很多人一上来就抱着机器学习数学公式调参的想法结果光是环境配置和数据处理就劝退了。我的建议一直很明确先花一周把numpy、pandas、matplotlib这三个库的基本操作彻底吃透再谈算法。因为不管你是看吴恩达的课程、啃周志华的《机器学习》还是跑Kaggle上的入门比赛你会发现所有代码都建立在这三个库之上——它们是机器学习的通用语言数据进模型之前要过它们的关训练出来的结果也要靠它们来理解和验证。这篇文章不是教科书式的API罗列而是按机器学习实际工作流来组织的实操笔记先说明为什么这三个库是一定要做的准备再逐一拆解它们最核心的操作、背后的原理、容易踩的坑最后集中排查新手最典型的几个问题。所有内容都围绕学机器学习之前需要什么基础这条主线展开你可以直接照着做。1. 为什么学机器学习之前要先把这三个库练熟1.1 它们分别对应机器学习流程中的哪一步机器学习项目落到代码上基本就是一条流水线数据加载与清洗、特征构造、转换为数值矩阵、训练模型、结果可视化。pandas负责前两段——读数据、清洗、变换、分组聚合numpy负责中间那段——把数据变成张量或者矩阵做数值运算matplotlib负责最后那段——画损失曲线、分布图、结果对比。三个库一前一后把整个流程的骨架撑起来了。你可能觉得我直接学scikit-learn不就行了说实话还真不行。scikit-learn的接口要求输入是二维数组形状为(n_samples, n_features)而这个数组要么直接是numpy数组要么是从pandas的DataFrame转过来的。你如果不懂numpy的shape、dtype、广播机制连喂数据给模型这一步都会莫名其妙报错不懂pandas特征选择、缺失值填充这些预处理根本没法做不懂matplotlib模型训练完你只剩一堆数字看不出收敛情况、分布差异和异常点。1.2 从热搜词能看出初学者最痛的点我特意翻了近期关于这个主题的热搜词发现大家的问题高度集中在这么几类numpy和list谁快、numpy怎么求矩阵逆、numpy版本不匹配、pandas数据类型转换、pandas正则表达式、matplotlib中figure/axes/axis三者的关系、散点图的透明度与网格、雷达图、还有一大堆安装报错ModuleNotFoundError。这些热搜词透露了一个关键信息绝大多数人不是卡在算法太难而是卡在基础工具不熟。np和list的性能差异涉及底层内存布局不搞明白就没法理解为什么要向量化figure、axes、axis搞不清楚画图就只能照着模板抄一旦要改子图、共享坐标轴就抓瞎版本不匹配更是环境问题里最常见的地雷。所以这篇我把这些内容全串起来讲清楚而不是给你一个干巴巴的API清单。2. 环境准备装库、选工具、版本匹配2.1 安装过程中的高频报错与处理思路热搜词里出现频率最高的错误就是ModuleNotFoundError: No module named numpy。这个错误本身很简单但我见过太多人卡在它上面根因基本是三种第一pip装到了系统Python而不是当前解释器第二用的是PyCharm但解释器没切换第三Jupyter用自己的kernel而安装用的是base环境。正确的处理方式分两步。第一步先确认当前环境里有没有库python -m pip list | grep numpy python -c import numpy; print(numpy.__version__)第二步如果确实没有再用python -m pip install而不是裸的pip install原因在于python -m pip能确保pip和当前解释器绑定避免装完找不到的经典问题。PyCharm用户记得在Settings Project Python Interpreter里确认环境路径Jupyter用户则要检查内核是否指向安装包的那个解释器。2.2 版本匹配别让版本成为第一个坑热搜词里numpy版本不匹配也是个高频词。这个坑通常出现在你装了最新版numpy但项目里某个库还没适配新版本的时候。最典型的表现形式是numpy.dtype size changed或者numpy.core._exceptions._ArrayMemoryError前者通常是二进制兼容性问题后者可能是内存不足。我给一个比较实用的版本选择策略不要追求最新版优先选scikit-learn、pandas、matplotlib这三个库当前依赖的numpy版本区间。如果你用的是Python 3.10及以上推荐组合是numpy1.26,2.0、pandas2.0、matplotlib3.8、scikit-learn1.3。如果安装时提示版本冲突用pip install numpy1.26.4 pandas2.1.4 matplotlib3.8.2 scikit-learn1.3.2这种显式指定版本的方式能一次性把环境锁死。2.3 用什么编辑器Jupyter Notebook还是PyCharm很多初学者会在Jupyter Notebook和PyCharm之间纠结。我的个人经验是两个都要用角色不同。Jupyter Notebook适合探索性分析——你加载数据、看一眼分布、试几个变换这些操作需要立刻看到结果反馈Notebook的单元格模式天然契合这种试错节奏。PyCharm适合写完整脚本——数据清洗逻辑、特征工程函数、模型训练流程这些是需要长期维护和调试的代码。如果你用的是PyCharm装包还有一个小技巧不要打开终端去pip直接去Settings Project Python Interpreter点加号搜索包名安装这样能保证包装进当前解释器。解决PyCharm怎么安装pandas包PyCharm安装matplotlib这类热搜问题最快的方式就是这个。3. NumPy实操从数组到广播把矩阵运算变成直觉3.1 numpy比list快在哪底层内存布局与广播机制numpy和list比快在哪能上热搜说明大家都听说过numpy快但不知道快在哪里。核心原因有两点。第一list存的是Python对象的引用每个对象还有类型信息、引用计数这些额外的开销内存不连续而numpy数组是一个连续的内存块里面存的是同一类型的原始数值CPU缓存命中率完全不同。举个直观的例子一个包含100万个整数的list和一个同样数据的numpy数组后者内存占用大约是前者的四分之一到三分之一。第二numpy的核心运算用C语言实现并且支持向量化操作不需要在Python层面一层层循环。还有一点是旁路机制broadcasting。所谓广播就是当两个数组shape不完全相同时numpy自动把维度较小的数组沿着缺失的维度拉伸到和另一个数组对齐再进行逐元素操作。比如一个形状为(3, 1)的数组和一个形状为(1, 4)的数组相加结果形状是(3, 4)。这个概念初学者很难一次上手但它几乎是所有numpy高效写法的灵魂机器学习里的标准化、归一化、加权求和处处都依赖它。3.2 机器学习中最常碰到的numpy操作集我把机器学习入门阶段最重要的numpy操作按场景做了分类不要贪多把这几组练熟就够了。创建数组import numpy as np # 从列表创建 arr np.array([1, 2, 3, 4, 5]) # 创建全0、全1、单位矩阵 zeros np.zeros((3, 4)) ones np.ones((2, 3)) eye np.eye(3) # 创建等差数列 range_arr np.arange(0, 10, 2) # [0, 2, 4, 6, 8] linspace_arr np.linspace(0, 1, 5) # [0, 0.25, 0.5, 0.75, 1] # 随机数机器学习里最常用 np.random.seed(42) # 固定随机种子便于复现 rand_arr np.random.rand(3, 3) # 均匀分布[0,1) normal_arr np.random.randn(3, 3) # 标准正态分布形状操作arr np.arange(12) # reshape不修改原始数据返回新视图 reshaped arr.reshape(3, 4) # 3行4列 flattened reshaped.flatten() # 拉平为一维 transposed reshaped.T # 转置 # 拼接与切分 a np.array([[1, 2], [3, 4]]) b np.array([[5, 6], [7, 8]]) hstacked np.hstack([a, b]) # 水平拼接列数增加 vstacked np.vstack([a, b]) # 垂直拼接行数增加索引与切片numpy的索引和Python列表类似但要记住一个关键差异切片返回的是原数组的视图view不是副本修改切片会影响原数组。如果你需要副本务必用.copy()。机器学习代码里经常因为这个问题莫名其妙改坏了原始数据。arr np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 取单个元素 print(arr[1, 2]) # 6 # 取第一行 print(arr[0, :]) # [1, 2, 3] # 取第一列 print(arr[:, 0]) # [1, 4, 7] # 布尔索引数据筛选的核心工具 mask arr 5 print(arr[mask]) # [6, 7, 8, 9]3.3 线性代数矩阵求逆、乘法与解方程机器学习里线性代数无处不在线性回归的闭式解w (X^T X)^(-1) X^T y就是典型例子。热搜词问的numpy如何求解矩阵的逆直接看这段代码# 求解矩阵的逆 A np.array([[1, 2], [3, 4]]) A_inv np.linalg.inv(A) # array([[-2. , 1. ], [ 1.5, -0.5]]) # 验证 A A_inv 是否等于单位阵 result np.round(A A_inv, 8) # 多数情况下你不需要显式求逆而是用solve解线性方程组 # 解 Ax b b np.array([5, 11]) x np.linalg.solve(A, b) # 比显式求逆更稳定更快这里必须提醒一句实际做机器学习时尽量用np.linalg.solve而不是np.linalg.inv再去乘。求逆的数值稳定性不如直接解方程尤其是当矩阵接近奇异时求逆会放大浮点误差。你只在需要显式看到逆矩阵时才用inv。3.4 归一化与标准化numpy在数据预处理中的典型应用模型训练之前特征缩放几乎是必做的一步。用numpy手写z-score标准化是这样的X np.array([[1, 200], [2, 400], [3, 600]]) # 计算每个特征的均值与标准差 mean X.mean(axis0) # axis0表示沿着行的方向求均值得到每列的均值 std X.std(axis0) # 标准化 (X - mean) / std X_scaled (X - mean) / std # 手动实现最小-最大归一化 X_min X.min(axis0) X_max X.max(axis0) X_norm (X - X_min) / (X_max - X_min)axis0和axis1是numpy新手最容易搞混的地方。我自己的记忆方法是axis0对应行方向但最终结果是沿着这个方向操作其他维度保留——所以X.mean(axis0)拿到的是一组列的均值X.mean(axis1)拿到的是一组行的均值。把这两个方向练熟后续大量操作都顺了。4. Pandas实操数据加载、清洗与特征工程的日常4.1 Series和DataFramepandas的两种核心数据结构pandas的两个核心数据结构一个是Series类似带索引的一维数组另一个是DataFrame类似带行索引和列名的二维表格。DataFrame每一列在底层其实都是一个Series理解这点对后面的操作很重要——你取一列时拿到的是Series对它做的一切操作如fillna、astype都会按列生效。创建DataFrame最常用的方式是从字典构建import pandas as pd data { name: [张三, 李四, 王五], age: [25, 30, 35], score: [85.5, 92.0, 78.5] } df pd.DataFrame(data) print(df.head(2)) # 查看前2行 print(df.info()) # 查看列名、非空计数、dtype print(df.describe()) # 数值列的统计摘要df.info()是拿到数据集后第一件要做的事它能瞬间告诉你数据长什么样、有没有缺值、每一列是什么类型。这一步判断错误后面所有预处理都会跑偏。4.2 数据加载从CSV和Excel读数据时的细节机器学习项目里数据最常见的存在形式就是CSV和Excel表格。pandas读取CSVdf pd.read_csv(data.csv) df pd.read_csv(data.csv, encodingutf-8) # 中文文件经常需要指定编码 df pd.read_csv(data.csv, parse_dates[date]) # 自动解析时间列pandas读取Excel文件是热搜词里的另一个高频问题这里有一个非常常见的坑read_excel依赖openpyxl或xlrd库如果只装了pandas没装读Excel的引擎会直接报ImportError: Missing optional dependency openpyxl。解决办法很直接pip install openpyxl之后就能正常读取了df pd.read_excel(data.xlsx, sheet_nameSheet1)我建议读入数据后统一做一次df.columns查看列名。我遇到过太多Excel表列名带空格、带特殊符号的情况这些在后续df[列名]索引时就是隐患预处理第一步应该顺手清理列名df.columns df.columns.str.strip().str.replace( , _)4.3 数据类型转换astype与to_datetime热搜词里pandas数据类型转换是高频问题它通常出在两个场景一是读入Excel后数字被识别成了字符串二是日期列变成了object类型。第一种场景的根源在于Excel单元格格式混乱比如001这种编号字符串在pandas读入后可能变成整数1。这时候显式转换类型# 转数值类型errorscoerce让无法转换的变NaN后续再处理 df[age] pd.to_numeric(df[age], errorscoerce) # 转字符串类型 df[id] df[id].astype(str) # 转时间类型 df[date] pd.to_datetime(df[date])特别注意astype是pandas里的高频操作但它不能处理字符串丢失非法时间格式这类情况。处理脏数据时优先用pd.to_numeric、pd.to_datetime再加errorscoerce把所有无法解析的变成缺失值再统一处理缺失值通道这样比让astype直接抛异常要优雅得多。4.4 数据清洗三板斧缺失值、重复值、正则筛选缺失值处理是数据清洗的重头戏。拿到数据后先看缺失情况# 缺失值统计 print(df.isnull().sum()) # 删除含缺失值的行 df_dropna df.dropna() # 用均值/中位数/固定值填充 df[score] df[score].fillna(df[score].mean()) # 用均值填充 df[age] df[age].fillna(0) # 用固定值填充 df df.ffill() # 用前一个有效值填充选择删除还是填充取决于业务逻辑和数据量。如果缺失比例超过30%我通常会考虑直接删掉该列如果只是个别行缺值也可以删行如果缺失值有规律如设备未上报则要考虑单独给一个缺失标记。重复值处理相对简单# 判断重复 print(df.duplicated().sum()) # 删除完全重复的行 df df.drop_duplicates() # 按指定列去重保留第一条 df df.drop_duplicates(subset[id], keepfirst)热搜词里的pandas正则表达式最常见的应用是把一列文本中的关键信息提取出来或者按规则筛选行。pandas的str访问器天然支持正则# 按正则筛选筛出所有邮箱格式的行 mask df[contact].str.contains(r^[a-zA-Z0-9._%-][a-zA-Z0-9.-]\.[a-zA-Z]{2,}$) df_email df[mask] # 提取手机号 df[phone] df[text].str.extract(r(1[3-9]\d{9})) # 把文本中的数字替换成空 df[clean_text] df[text].str.replace(r\d, , regexTrue)正则表达式本身是个大课题但在pandas里你只需要记住几个常用模式就够起步\d匹配数字、\w匹配字母数字下划线、.*?非贪婪匹配、用()做捕获组提取。不要一上来就背复杂的正则先学会在具体列上用str.contains做筛选用str.extract做提取这两个够应付大多数初学场景。4.5 特征工程的基础操作groupby、apply、ewm特征工程是机器学习和数据分析的交叉地带pandas在这里承担主要工作。groupby是我们做分组聚合的利器它的逻辑可以拆成三步拆分split→ 应用apply→ 合并combine。举个例子计算不同年龄段用户的平均分# 先创建年龄分组列 df[age_group] pd.cut(df[age], bins[0, 18, 30, 60], labels[少年, 青年, 中老年]) # 按分组列聚合求平均分和人数 result df.groupby(age_group)[score].agg([mean, count, std])apply是我们对DataFrame或Series逐行/逐列施加自定义函数的方法。很多初学机器学习的人一上来就用apply写复杂逻辑但我要提醒一句apply本质上还是在Python层循环速度远慢于向量化操作。能用df[score] * 2这种向量化写法就别用apply必须用apply时优先选择Series.apply而不是DataFrame.apply按行跑因为后者开销更大。ewm函数是pandas里的指数加权移动平均它在时间序列平滑、波动率估计里很常用。参数主要有span、alpha、halflife其中span对应的关系是alpha 2 / (span 1)。比如# 指数加权移动平均span5表示最近5期左右的权重集中区 df[ewm_score] df[score].ewm(span5).mean()初学阶段不需要深入推导ewm的数学细节但要理解它的作用比简单移动平均更看重近期数据在预测任务中能有效降低噪声。5. Matplotlib实操把数据讲清楚先搞懂figure、axes、axis5.1 figure、axes、axis这三个概念到底是什么热搜词里matplotlib中figure、axes、axis三个核心概念之间的关系和区别能上热搜说明这是几乎所有初学者都会卡住的概念。我用大白话解释一遍你一旦想通就再也忘不掉。一个完整的matplotlib图形结构可以类比成一块画板。figure是整个画板或窗口它承载一切在这块画板上可以有多个子图区域每个子图区域在matplotlib里叫axes而axis不是axes的复数它指的是坐标系里的x轴或y轴。所以一张figure可以包含多个axes每个axes都有自己的x轴和y轴。对应到代码层面import matplotlib.pyplot as plt # 创建一张画布包含1行1列的子图布局返回figure对象和axes对象 fig, ax plt.subplots(1, 2, figsize(10, 4)) # ax是包含两个axes对象的数组 ax[0].plot([1, 2, 3], [4, 5, 6]) ax[1].scatter([1, 2, 3], [4, 5, 6]) # 设置x轴标签这操作的是axis ax[0].set_xlabel(x) ax[0].set_ylabel(y) # 设置标题 ax[0].set_title(折线图) plt.tight_layout() plt.show()很多人用matplotlib熟练之后就只用plt.plot、plt.xlabel这种pyplot接口完全不接触axes对象。短时间内没问题但一旦涉及到子图布局、共享坐标轴、在同一个图上叠加多个坐标系不理解axes就寸步难行。我的建议是从一开始就用fig, ax plt.subplots()这种显式面向对象的写法养成习惯后你的控制力会上一个台阶。5.2 机器学习场景中最常用的几种图我把机器学习过程中最高频的图形需求列一遍每一种给出适用场景和核心参数你按需抄作业就行。折线图看训练曲线、损失下降# 模拟训练过程中的损失变化 epochs range(1, 51) train_loss [0.9 / (i**0.5) 0.05 for i in epochs] val_loss [0.95 / (i**0.4) 0.08 for i in epochs] fig, ax plt.subplots(figsize(8, 5)) ax.plot(epochs, train_loss, labeltrain_loss, linewidth2) ax.plot(epochs, val_loss, labelval_loss, linewidth2, linestyle--) ax.set_xlabel(Epoch) ax.set_ylabel(Loss) ax.set_title(训练过程损失曲线) ax.legend() ax.grid(True, alpha0.3) plt.show()训练曲线是最需要做出来的图之一训练损失持续下降但验证损失开始抬升那就是过拟合的典型信号两个损失都不降说明模型没有在学习。这里legend、grid、linestyle都是高频参数热搜词也专门提到图例和网格。散点图看二维特征分布、回归拟合效果import numpy as np np.random.seed(42) x np.random.randn(100) y 2 * x 1 np.random.randn(100) * 0.5 fig, ax plt.subplots() ax.scatter(x, y, alpha0.6, s30, csteelblue, edgecolorswhite) ax.set_xlabel(Feature) ax.set_ylabel(Target) ax.set_title(回归数据的散点图) ax.grid(True, linestyle--, alpha0.4) plt.show()散点图的两个参数强烈建议熟练掌握alpha控制透明度当数据点特别多、重叠严重时把alpha调到0.3~0.6能看清密度分布这是热搜词散点图透明度网格背后的实际诉求c控制颜色在分类问题里常用cy按标签着色。直方图与箱线图看单变量分布与异常值fig, axes plt.subplots(1, 2, figsize(10, 4)) # 直方图 axes[0].hist(df[score], bins30, edgecolorwhite) axes[0].set_title(score分布直方图) # 箱线图 axes[1].boxplot(df[score]) axes[1].set_title(score箱线图)直方图和箱线图能快速告诉你数据是否偏态、有没有离群点。如果数据严重偏态后续建模前往往要做对数变换。雷达图多维度指标对比热搜词里matplotlib雷达图也有不少人搜索。雷达图适合展示多个维度的数值对比比如不同模型在不同指标上的表现。核心代码是用极坐标绘制import numpy as np labels [准确率, 精确率, 召回率, F1-score, AUC] model1 [0.85, 0.80, 0.82, 0.81, 0.88] model2 [0.80, 0.85, 0.78, 0.81, 0.82] angles np.linspace(0, 2 * np.pi, len(labels), endpointFalse).tolist() angles angles[:1] # 闭合 model1 model1[:1] model2 model2[:1] fig, ax plt.subplots(figsize(6, 6), subplot_kwdict(polarTrue)) ax.plot(angles, model1, labelModel1) ax.fill(angles, model1, alpha0.25) ax.plot(angles, model2, labelModel2) ax.fill(angles, model2, alpha0.25) ax.set_xticks(angles[:-1]) ax.set_xticklabels(labels) ax.legend(locupper right) plt.show()注意雷达图有个大坑数据必须闭合也就是数组首尾要相接否则画出来的图形不封口。5.3 子图、图例、颜色与中文乱码的处理子图布局用plt.subplots(nrows, ncols)就能搞定重点是灵活搭配figsize控制整体尺寸避免图太小或比例失衡。图例的处理有三个容易忽略的细节一是必须先给每个plot传label参数legend才有内容可显示二是loc参数控制图例位置数据点占据右上角时改成upper left或lower right三是图例字体可以用prop{size: 10}控制大小。中文乱码是matplotlib另一大痛点默认字体不含中文字形。一套稳定方案是import matplotlib.pyplot as plt plt.rcParams[font.sans-serif] [SimHei, Microsoft YaHei, Noto Sans CJK JP] # 按系统选择 plt.rcParams[axes.unicode_minus] False # 解决负号显示为方块的问题设置之后负号显示也要单独处理因为默认的减号字形也依赖字体。Mac用户可以用Arial Unicode MSLinux用户装fonts-noto-cjk后设Noto Sans CJK SC。6. 新手最典型的三类报错与排查思路6.1 ModuleNotFoundError大多数人没真正弄清楚环境ModuleNotFoundError: No module named numpy或者pandas、matplotlib是绝对的热搜词冠军。前面我在环境部分说了基本解法这里把完整排查链路给你列出来照着做就行。第一步判断当前解释器python -c import sys; print(sys.executable)这个命令会输出当前使用的Python解释器路径。确认它是不是你IDE里选的那个路径。第二步如果系统里其实装了numpy但导入失败用排除法python -m pip show numpy python -c import numpy; print(numpy.__file__)如果pip show有输出但import失败大概率是解释器对不上如果都没输出那就是没装。第三步重装或修复python -m pip uninstall numpy python -m pip install numpy在PyCharm里最容易忽略的是项目解释器被设置成了虚拟环境而虚拟环境里没有装包。我的建议是新建项目时选择New environment using Virtualenv之后所有包都在这个虚拟环境里装别用系统环境这样项目间不会互相污染。6.2 numpy版本不匹配和谁匹配怎么锁版本numpy版本不匹配的报错有几种常见形态每种处理方式不一样。第一种是编译型报错比如numpy.dtype size changed这往往是某个扩展模块是按旧版numpy编译的新版numpy改了二进制结构。解法把numpy降到项目依赖要求的版本比如pip install numpy1.26.4。第二种是API变更报错比如调用np.float、np.bool等已被移除的别名新版numpy给出了更清晰的报错提示。解法改成float、bool或使用np.float64。如果你在跑一些老教程的代码这种情况非常常见。第三种是依赖冲突比如安装了最新版numpy后某个库声明它只支持numpy2.0pip安装时会自动尝试降级但有时降级不干净。解法用pip check检查依赖一致性pip check如果提示冲突直接按前面推荐的安全组合重装一遍。我的经验是在一开始就建一个requirements.txt把版本锁死后面能少踩80%的版本坑。6.3 matplotlib显示异常文字、画布、性能三类问题matplotlib的显示问题初学者遇到最多的是空白图、中文方块、图像不刷新这三类。空白图通常是因为用了非交互式后端或者没有调用plt.show()。在Notebook里用%matplotlib inline在脚本里老老实实加plt.show()如果你用的是PyCharm的SciView它有时需要手动关闭交互模式在代码开头加plt.switch_backend(TkAgg)试试。中文方块问题就是前面说的rcParams设置不再重复。还有一类不太容易想到保存图片时中文正常、显示时就变方块这种情况要检查你当前的交互后端是否支持所选字体常见的解决方式是统一设置plt.rcParams[font.family]为系统已有中文字体。图像不刷新是Notebook里的经典坑你在一个单元格里改了代码重新运行但图片还是上一张。解决方式是在绘图单元格的最前面加plt.clf()清除当前figure和plt.close(all)关闭所有figure这样可以避免图形对象残留。我自己的习惯是在每个Notebook的绘图代码块开头都放一个plt.clf()习惯了之后这类问题几乎不会碰见。6.4 一套自查组合命令最后分享一个我在带新人时给的三板斧自查流程每到一个新项目先把这三条命令跑一遍能避免大量后续问题python -c import sys; print(sys.executable) python -c import numpy; print(numpy.__version__); import pandas; print(pandas.__version__); import matplotlib; print(matplotlib.__version__) python -m pip check第一条确认解释器第二条确认核心库有没有装上、版本是多少第三条确认依赖关系是否一致。如果这三条都没有报错那环境就基本稳了接下来才值得花时间在算法和数据上。我在实际带项目的过程中还发现一个规律凡是环境问题频繁的人大多不是因为操作复杂而是因为从来不确认当前代码到底在哪个环境里跑。只要把这个习惯改过来与其反复搜索各种报错代码不如从一开始就和自己的环境建立明确的认知边界。
返回列表