:环境搭建与数组核心操作)
目录前言一、环境准备Anaconda Jupyter1.1 为什么选择 Anaconda1.2 安装要点Windows 端1. ☑️ Create shortcuts (supported packages only).2. ☐ Add installation to my PATH environment variable3. ☐ Register Anaconda3 as my default Python 3.144. ☐ Clear the package cache upon completionLinux 端1.3 必做配置更换国内镜像源1.4 conda 常用命令环境管理1.5 Jupyter Notebook/Lab二、NumPy 核心ndarray 数组2.1 什么是 ndarray2.2 数组的核心属性2.3 数据类型三、数组的 7 种创建方式1. array () 与 asarray ()2. 全 0 / 全 1 / 空数组3. 固定值填充4. 序列生成5. 等差 / 等比数列6. 随机数数组7. 矩阵创建四、索引与切片4.1 一维切片4.2 多维切片4.3 布尔索引五、常用运算与函数5.1 向量化运算5.2 常用数学函数5.3 统计函数5.4 比较与逻辑5.5 排序与去重六、广播机制广播三条规则七、矩阵乘法小结前言做数据分析、大模型开发Python 是绝对的主力语言而 NumPy 是整个科学计算栈的基石 —— 高效的多维数组运算、广播机制是 Pandas、TensorFlow、PyTorch 这些上层库的底层基础。很多人觉得 NumPy 就是个存数组的工具实则它的向量化运算思想才是核心能把循环级别的运算速度提升几个数量级。这篇是我系统梳理 NumPy 学习笔记的第一篇从环境搭建到数组的核心操作都是日常开发最高频用到的内容附上手写的代码示例和踩坑提示。一、环境准备Anaconda Jupyter1.1 为什么选择 Anaconda如果直接装原生 Python后续装 NumPy、Pandas、机器学习库的时候很容易遇到依赖冲突、版本不兼容的问题。Anaconda 相当于把 Python 解释器、包管理器、常用数据科学库、开发工具打包到了一起优势很明显开箱即用预装了 NumPy、Pandas、Matplotlib 等几十种常用库不用逐个安装环境隔离conda 可以创建多个独立的 Python 环境不同项目用不同版本的库互不冲突跨平台Windows、macOS、Linux 都能用环境配置一致工具集成自带 Jupyter Notebook/Lab、Spyder 等开发工具1.2 安装要点Windows 端官网下载对应版本的安装包一路下一步即可。有两个注意点不建议勾选「Add Anaconda to PATH」避免和系统原有 Python 冲突使用时从开始菜单打开「Anaconda Prompt」即可安装路径建议选纯英文、无空格的目录避免后续一些库出现路径问题各个选项的解释如下1. ☑️ Create shortcuts (supported packages only).解释创建快捷方式仅限支持的包。勾选后你的 Windows 开始菜单里会出现 Anaconda Navigator图形化界面、Anaconda Prompt命令行等快捷方式。建议保持勾选图上默认已勾选。这对新手非常友好方便你快速找到并打开 Anaconda 的命令行工具。2. ☐ Add installation to my PATH environment variable解释将 Anaconda 添加到系统的 PATH 环境变量中。如果勾选你打开系统的 cmd 或 PowerShell 时直接输入python或conda就能运行。⚠️ 警告下面红字明确写了“NOT RECOMMENDED”不推荐。因为强行加入环境变量极容易导致你的电脑上已有的其他 Python 环境、或者其他依赖 Python 的软件发生版本冲突。建议不要勾选。替代方案既然不勾选以后怎么用命令呢安装完成后去开始菜单搜索并打开“Anaconda Prompt”。在这个专门的窗口里输入命令它自带了环境配置完全不会出错。3. ☐ Register Anaconda3 as my default Python 3.14解释将 Anaconda 注册为 Windows 系统的默认 Python。建议建议不勾选。原因你既然要用 PyCharm 开发完全可以在 PyCharm 里面手动指定使用 Anaconda 创建的环境在 PyCharm 里新建项目时选择 Conda 环境即可。如果在这里注册为默认可能会影响你电脑上其他已经安装好的开发工具。让 PyCharm 自己去找它就行不需要系统全局默认。4. ☐ Clear the package cache upon completion解释安装完成后清除包缓存。安装过程会下载很多安装包并留在电脑里勾选可以腾出大约 1-2 GB 的硬盘空间。建议保持不勾选保持图上的空白。原因对于 AI 开发来说硬盘空间通常够用。保留缓存的好处是如果你以后想要新建环境重装某些库由于本地有缓存安装速度会快很多。如果不差这 1-2 GB 空间留着更实用。后续一直点下一步等待安装即可Linux 端下载对应版本的.sh安装脚本执行安装bash Anaconda3-xxx-Linux-x86_64.sh按提示确认协议指定安装路径最后输入yes初始化 conda。重启终端后命令行前缀会出现(base)代表默认的 base 环境激活成功。1.3 必做配置更换国内镜像源默认 conda 的源服务器在海外下载库的时候速度很慢甚至超时建议换成中科大镜像源。 在用户目录下找到.condarc文件没有就执行conda config --set show_channel_urls yes生成写入以下内容channels: - https://mirrors.ustc.edu.cn/anaconda/pkgs/main - https://mirrors.ustc.edu.cn/anaconda/cloud/conda-forge - defaults show_channel_urls: true配置完之后安装速度会提升很多。1.4 conda 常用命令环境管理# 创建环境指定Python版本 conda create -n 环境名 python3.12 # 激活环境 conda activate 环境名 # 退出当前环境 conda deactivate # 列出所有环境 conda env list # 删除环境 conda remove -n 环境名 --all包管理# 安装包 conda install 包名 # 安装指定版本 conda install numpy1.26.4 # 更新包 conda update 包名 # 卸载包 conda remove 包名测试了几个命令 可以正常使用PyCharm中也可以根据不同的项目使用不同的conda解析器实现环境隔离。1.5 Jupyter Notebook/LabJupyter 是交互式的代码笔记本写一段运行一段非常适合数据分析、学习验证。本地使用终端输入jupyter lab会自动弹出浏览器页面远程服务配置如果是服务器上部署修改配置文件可以允许外部访问、设置登录密码本地浏览器就能连接使用常用快捷键命令模式下ESC切换命令模式a在当前单元格上方新建单元格b在当前单元格下方新建单元格dd删除当前单元格m切换为 Markdown 模式y切换为代码模式CtrlEnter运行当前单元格ShiftEnter运行当前单元格并跳到下一个二、NumPy 核心ndarray 数组2.1 什么是 ndarrayNumPy 的核心是多维数组对象ndarray和 Python 原生的 list 有本质区别同类型元素数组里所有元素必须是同一数据类型这样才能做向量化运算连续内存存储数据在内存中是连续存放的访问速度比 list 快很多固定大小创建之后总大小不能改变要改大小本质是创建新数组2.2 数组的核心属性import numpy as np # 创建一个2行3列的数组 arr np.array([[1, 2, 3], [4, 5, 6]]) print(维度数:, arr.ndim) # 2 print(形状:, arr.shape) # (2, 3) print(元素总数:, arr.size) # 6 print(数据类型:, arr.dtype) # int64 print(单个元素字节数:, arr.itemsize) # 82.3 数据类型NumPy 支持丰富的数据类型常用的有类型说明int8/int16/int32/int64有符号整数分别占 1/2/4/8 字节uint8/uint16无符号整数float32/float64单精度 / 双精度浮点数bool布尔类型complex64/complex128复数类型创建数组时可以用dtype指定类型也可以用astype()转换类型# 创建时指定类型 arr_float np.array([1, 2, 3], dtypenp.float32) # 类型转换 arr_int arr_float.astype(np.int64)踩坑提示类型转换要注意精度丢失比如 float 转 int 会直接舍弃小数部分不是四舍五入。三、数组的 7 种创建方式1. array () 与 asarray ()np.array()把输入转成数组一定会创建新的拷贝np.asarray()如果输入本身就是 ndarray就不拷贝直接返回原数组节省内存2. 全 0 / 全 1 / 空数组# 创建2行5列的全0数组默认float64类型 zeros np.zeros((2, 5)) # 创建和zeros形状一样的全1数组 ones np.ones_like(zeros) # 创建未初始化的数组值是内存里的随机值速度最快 empty np.empty((2, 3))3. 固定值填充# 创建2行3列全部填充6 full_arr np.full((2, 3), 6)4. 序列生成# 从0到10步长2不包含10 arr np.arange(0, 10, 2) # [0 2 4 6 8]5. 等差 / 等比数列# 0到10之间生成5个元素的等差数列 lin np.linspace(0, 10, 5) # [ 0. 2.5 5. 7.5 10. ] # 指数从2到55个元素底数为2的等比数列 log np.logspace(2, 5, 5, base2) # [ 4. ... 32.]注意linspace默认包含首尾两个端点endpointFalse可以去掉右端点。6. 随机数数组# [0,1)均匀分布2行3列 rand_arr np.random.rand(2, 3) # 0到10之间的随机整数2行3列 int_arr np.random.randint(0, 10, (2, 3)) # 标准正态分布均值0标准差12行3列 normal_arr np.random.randn(2, 3)7. 矩阵创建np.matrix()专门生成二维矩阵是 ndarray 的子类支持一些矩阵专属的写法。不过现在更推荐直接用二维 ndarray兼容性更好。四、索引与切片4.1 一维切片和 Python 列表的切片规则一致start:stop:step左闭右开arr np.arange(10) print(arr[2]) # 取索引2的元素 print(arr[2:9:2]) # 从2到9步长2 print(arr[2:]) # 从2到最后4.2 多维切片用逗号分隔不同维度的切片规则arr np.array([[1,2,3],[4,5,6],[7,8,9]]) # 取所有行第0到1列 print(arr[:, 0:2]) # 输出 # [[1 2] # [4 5] # [7 8]] # 取第0到1行所有列 print(arr[0:2, :])4.3 布尔索引按条件筛选元素非常常用arr np.array([1, -2, 3, -5, 4]) # 筛选大于0的元素 print(arr[arr 0]) # [1 3 4]五、常用运算与函数5.1 向量化运算NumPy 不用写循环直接对整个数组做运算这就是向量化的核心arr np.array([[1,2],[3,4]]) # 数组和标量运算每个元素都和标量计算 print(arr 10) # 输出 # [[11 12] # [13 14]] print(arr * 2) # 两个形状相同的数组对应位置元素运算 arr2 np.array([[10,20],[30,40]]) print(arr arr2) # 输出 # [[11 22] # [33 44]]5.2 常用数学函数import numpy as np np.random.seed(0) # 固定随机数种子保证每次生成同样的 arr arr np.random.randn(2, 3) # arr 的固定结果 # array([[ 1.76405235, 0.40015721, 0.97873798], # [ 2.2408932 , 1.86755799, -0.97727788]]) np.abs(arr) # 绝对值 # 结果 # array([[1.76405235, 0.40015721, 0.97873798], # [2.2408932 , 1.86755799, 0.97727788]]) np.ceil(arr) # 向上取整 # 结果 # array([[ 2., 1., 1.], # [ 3., 2., -0.]]) np.floor(arr) # 向下取整 # 结果 # array([[ 1., 0., 0.], # [ 2., 1., -1.]]) np.rint(arr) # 四舍六入 五成双 # 结果 # array([[ 2., 0., 1.], # [ 2., 2., -1.]]) np.isnan(arr) # 判断是不是NaN # 结果 # array([[False, False, False], # [False, False, False]]) # 补充np.random.randn 本身不会生成 NaN所以这里全是 False np.where(arr 0, 1, 0) # 三元运算满足条件取1否则取0 # 结果 # array([[1, 1, 1], # [1, 1, 0]])5.3 统计函数import numpy as np # 原写法arr np.random.randint(1, 10, (3, 4)) # 为了结果可复现这里固定一个例子 arr np.array([[1, 2, 3, 4], [5, 6, 7, 8], [9, 1, 2, 3]]) np.sum(arr) # 所有元素求和 # 结果51 np.mean(arr) # 平均值 # 结果4.25 # 补充51 / 12 4.25 np.max(arr) # 最大值 # 结果9 np.min(arr) # 最小值 # 结果1 np.std(arr) # 标准差 # 结果2.618046345... # 补充默认 ddof0计算的是总体标准差 np.var(arr) # 方差 # 结果6.854166666666667 # 补充默认 ddof0计算的是总体方差std sqrt(var) np.argmax(arr) # 最大值的索引 # 结果8 # 补充默认先把数组拉平再找索引索引从 0 开始 # 拉平后为 [1,2,3,4,5,6,7,8,9,1,2,3]最大值 9 在索引 8 np.cumsum(arr) # 累加和 # 结果 # array([ 1, 3, 6, 10, 15, 21, 28, 36, 45, 46, 48, 51]) # 补充默认 axisNone会先把数组拉平成一维再累加 # 最后一个值 51 正好等于 np.sum(arr)重点理解axis参数axis0按列计算沿着行的方向对每一列操作axis1按行计算。很多新手在这里卡很久记住沿着哪个轴哪个轴就被 “压缩” 掉。5.4 比较与逻辑import numpy as np arr np.array([1, 2, 3, 4, 5]) np.any(arr 3) # 至少一个满足返回True # 结果True # 补充arr 3 得到 [False, False, False, True, True] # 其中有 True4 和 5 大于 3所以 np.any 返回 True np.all(arr 3) # 全部满足才返回True # 结果False # 补充arr 3 得到 [False, False, False, True, True] # 并不是全部为 True1、2、3 不满足所以 np.all 返回 False5.5 排序与去重import numpy as np arr np.array([3, 1, 4, 1, 5, 9, 2, 6]) # 排序返回新数组 print(np.sort(arr)) # 输出 # [1 1 2 3 4 5 6 9] # 补充np.sort 返回排好序的新数组原 arr 不会被修改 # 排序后为 [1, 1, 2, 3, 4, 5, 6, 9] # 去重 print(np.unique(arr)) # 输出 # [1 2 3 4 5 6 9] # 补充np.unique 会先去重并且默认按升序排列 # 原数组中的重复元素 1 只保留一个六、广播机制广播是 NumPy 非常强大的特性允许不同形状的数组之间做运算不用手动扩展成一样的形状。广播三条规则维度数不同时小维度数组的形状在最左边补 1每个维度上如果其中一个数组的大小是 1就自动扩展成和另一个数组一样大任何维度上两个数组大小都不为 1 且不相等就报错简单说就是小的那个能凑成大的形状就能运算。import numpy as np # 二维数组(2,3) 一维数组(3,) # 自动把一维补成(1,3)再扩展成(2,3) arr1 np.ones((2, 3)) # arr1: # array([[1., 1., 1.], # [1., 1., 1.]]) arr2 np.array([1, 2, 3]) # arr2: # array([1, 2, 3]) print(arr1 arr2) # 输出 # [[2. 3. 4.] # [2. 3. 4.]] # 补充广播过程—— # arr1 形状 (2, 3) # arr2 形状 (3,) - 先在左边补 1 变成 (1, 3) - 再沿第 0 轴复制 2 份变成 (2, 3) # 等价于 # [[1,1,1] [[1,2,3] [[2,3,4] # [1,1,1]] [1,2,3]] [2,3,4]]七、矩阵乘法注意*运算符是对位乘法也就是对应位置元素相乘不是数学里的矩阵乘法。 真正的矩阵乘法用np.dot()或者运算符import numpy as np # (2,3) (3,2) (2,2) a np.array([[1, 2, 3], [4, 5, 6]]) # a 的形状(2, 3) b np.array([[1, 2], [3, 4], [5, 6]]) # b 的形状(3, 2) print(np.dot(a, b)) # 输出 # [[22 28] # [49 64]] # 补充np.dot 对二维数组做矩阵乘法等价于 a b print(a b) # 输出 # [[22 28] # [49 64]] # 补充 是矩阵乘法运算符结果和 np.dot 完全一样手算验证行 × 列对应元素相乘再求和a b [[1,2,3], [[1,2], [4,5,6]] [3,4], [5,6]] 第 1 行第 1 列1×1 2×3 3×5 1 6 15 22 第 1 行第 2 列1×2 2×4 3×6 2 8 18 28 第 2 行第 1 列4×1 5×3 6×5 4 15 30 49 第 2 行第 2 列4×2 5×4 6×6 8 20 36 64矩阵乘法规则第一个矩阵的列数 第二个矩阵的行数结果的行数是第一个的行数列数是第二个的列数。小结本篇覆盖了 NumPy 最核心的基础环境搭建、数组创建、索引切片、常用运算、广播和矩阵乘法。这些是后续 Pandas、机器学习的底层基础把代码都跑了一遍感受了向量化的效率。下一篇打算学习 Pandas处理更贴近实际工作的结构化表格数据。