☰
NumPy 入门实战(一):环境搭建与数组核心操作
2026/10/20 2:20:44 网站建设 项目流程

目录

前言

一、环境准备:Anaconda + Jupyter

1.1 为什么选择 Anaconda

1.2 安装要点

Windows 端

1. ☑️ Create shortcuts (supported packages only).

2. ☐ Add installation to my PATH environment variable

3. ☐ Register Anaconda3 as my default Python 3.14

4. ☐ Clear the package cache upon completion

Linux 端

1.3 必做配置:更换国内镜像源

1.4 conda 常用命令

环境管理

1.5 Jupyter Notebook/Lab

二、NumPy 核心:ndarray 数组

2.1 什么是 ndarray

2.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 + Jupyter

1.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 环境名 python=3.12 # 激活环境 conda activate 环境名 # 退出当前环境 conda deactivate # 列出所有环境 conda env list # 删除环境 conda remove -n 环境名 --all

包管理

# 安装包 conda install 包名 # 安装指定版本 conda install numpy=1.26.4 # 更新包 conda update 包名 # 卸载包 conda remove 包名

测试了几个命令 可以正常使用

PyCharm中也可以根据不同的项目使用不同的conda解析器,实现环境隔离。

1.5 Jupyter Notebook/Lab

Jupyter 是交互式的代码笔记本,写一段运行一段,非常适合数据分析、学习验证。

  • 本地使用:终端输入jupyter lab,会自动弹出浏览器页面
  • 远程服务配置:如果是服务器上部署,修改配置文件可以允许外部访问、设置登录密码,本地浏览器就能连接使用

常用快捷键(命令模式下ESC切换命令模式):

  • a:在当前单元格上方新建单元格
  • b:在当前单元格下方新建单元格
  • dd:删除当前单元格
  • m:切换为 Markdown 模式
  • y:切换为代码模式
  • Ctrl+Enter:运行当前单元格
  • Shift+Enter:运行当前单元格并跳到下一个

二、NumPy 核心:ndarray 数组

2.1 什么是 ndarray

NumPy 的核心是多维数组对象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) # 8

2.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], dtype=np.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到5,5个元素,底数为2的等比数列 log = np.logspace(2, 5, 5, base=2) # [ 4. ... 32.]

注意:linspace默认包含首尾两个端点,endpoint=False可以去掉右端点。

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,标准差1),2行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... # 补充:默认 ddof=0,计算的是总体标准差 np.var(arr) # 方差 # 结果:6.854166666666667 # 补充:默认 ddof=0,计算的是总体方差;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]) # 补充:默认 axis=None,会先把数组拉平成一维再累加; # 最后一个值 51 正好等于 np.sum(arr)

重点理解axis参数:axis=0按列计算(沿着行的方向,对每一列操作),axis=1按行计算。很多新手在这里卡很久,记住:沿着哪个轴,哪个轴就被 “压缩” 掉。

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], # 其中有 True(4 和 5 大于 3),所以 np.any 返回 True np.all(arr > 3) # 全部满足才返回True # 结果:False # 补充:arr > 3 得到 [False, False, False, True, True], # 并不是全部为 True(1、2、3 不满足),所以 np.all 返回 False

5.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
  2. 每个维度上,如果其中一个数组的大小是 1,就自动扩展成和另一个数组一样大
  3. 任何维度上两个数组大小都不为 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,处理更贴近实际工作的结构化表格数据。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询