Day 46:【99天精通Python】数据分析 NumPy 基础 - 高性能计算的基石
前言
欢迎来到实战篇的第一天(第46天)!
从今天开始,我们将踏入 Python 最引以为傲的领域——数据分析与科学计算。在这个领域,Python 是当之无愧的霸主。无论是金融量化、人工智能、图像处理,还是科研数据分析,Python 都是首选语言。
而这一切的基石,就是NumPy。
你可能会问:“Python 不是自带列表(List)吗?为什么还要学一个 NumPy 数组?”
简单的回答是:NumPy 比 Python 列表快 10 倍甚至 100 倍,而且更省内存。
本节内容:
- 数据分析三剑客简介
- NumPy ndarray vs Python List
- 创建数组的多种方式
- 数组的属性 (shape, dtype)
- 基础运算与广播机制 (Broadcasting)
- 索引与切片入门
一、数据分析三剑客
在 Python 数据分析领域,有三个库是必须掌握的核心:
- NumPy (Numerical Python):提供高性能的数组计算,是其他所有库的基础。
- Pandas:基于 NumPy,提供了类似 Excel 的表格数据结构 (DataFrame),擅长数据清洗和处理。
- Matplotlib:负责画图,将数据可视化。
我们先从地基 NumPy 开始。
安装:
pipinstallnumpy二、为什么用 NumPy?
2.1 性能对比
Python 的 List 是一个"大杂烩",里面可以存整数、字符串、对象,这导致它在内存中存储是不连续的,计算时需要检查每个元素的类型,效率低下。
NumPy 的数组 (ndarray) 要求所有元素类型相同,在内存中是连续存储的,并且底层用 C 语言编写,可以充分利用 CPU 的 SIMD 指令集进行并行计算。
实测对比:计算 100 万个数字的平方和。
importnumpyasnpimporttime size=1_000_000# --- Python List ---list_data=list(range(size))start=time.time()sum([x**2forxinlist_data])print(f"List 耗时:{time.time()-start:.4f}秒")# --- NumPy Array ---np_data=np.arange(size)start=time.time()np.sum(np_data**2)print(f"NumPy 耗时:{time.time()-start:.4f}秒")结果:NumPy 通常比 List 快 10-50 倍!
三、创建数组 (ndarray)
ndarray(N-dimensional array object) 是 NumPy 的核心对象。
3.1 从列表创建np.array()
importnumpyasnp# 一维数组arr1=np.array([1,2,3,4,5])print(arr1)# 二维数组 (矩阵)arr2=np.array([[1,2,3],[4,5,6]])print(arr2)3.2 快速生成
# 生成全0数组 (float类型)print(np.zeros(5))# [0. 0. 0. 0. 0.]# 生成全1数组 (指定int类型)print(np.ones((2,3),dtype=int))# [[1 1 1]# [1 1 1]]# 类似 range()print(np.arange(0,10,2))# [0 2 4 6 8]# 等差数列 (linspace): 0到1之间生成5个点print(np.linspace(0,1,5))# [0. 0.25 0.5 0.75 1. ]# 随机数 (0-1之间)print(np.random.rand(3,3))四、数组的属性
了解数组长什么样非常重要。
arr=np.array([[1,2,3],[4,5,6]])print(f"维度 (ndim):{arr.ndim}")# 2print(f"形状 (shape):{arr.shape}")# (2, 3) -> 2行3列print(f"元素总数 (size):{arr.size}")# 6print(f"数据类型 (dtype):{arr.dtype}")# int64 (或 int32)注意:NumPy 的数据类型比 Python 丰富,如
int8,int16,float32等,这有助于精确控制内存占用。
五、基础运算与广播 (Broadcasting)
这是 NumPy 最爽的地方。在 Python List 里,[1, 2] + [3, 4]结果是[1, 2, 3, 4](拼接)。
但在 NumPy 里,运算是基于元素 (Element-wise)的。
5.1 数组与数字运算
arr=np.array([1,2,3])print(arr+10)# [11 12 13] (每个元素都+10)print(arr*2)# [2 4 6]print(arr>1)# [False True True] (生成布尔数组)5.2 数组与数组运算
a=np.array([1,2,3])b=np.array([10,20,30])print(a+b)# [11 22 33]print(a*b)# [10 40 90] (对应位置相乘,不是矩阵乘法!)5.3 统计计算
arr=np.array([[1,2,3],[4,5,6]])print(np.sum(arr))# 所有元素之和: 21print(np.mean(arr))# 平均值: 3.5print(np.max(arr))# 最大值: 6# 指定维度 (axis)# axis=0: 跨行操作 (压缩行,保留列) -> 计算每一列的和print(np.sum(arr,axis=0))# [5 7 9] (1+4, 2+5, 3+6)# axis=1: 跨列操作 (压缩列,保留行) -> 计算每一行的和print(np.sum(arr,axis=1))# [6 15]六、索引与切片
6.1 一维数组 (同 Python List)
arr=np.arange(10)print(arr[2])# 2print(arr[2:5])# [2 3 4]print(arr[::-1])# 反转6.2 多维数组
语法:arr[行, 列]
arr=np.array([[1,2,3],[4,5,6],[7,8,9]])print(arr[0,0])# 1 (第0行第0列)print(arr[1,:])# [4 5 6] (第1行,所有列)print(arr[:,1])# [2 5 8] (所有行,第1列)print(arr[0:2,1:3])# [[2 3]# [5 6]] (前两行,第1-2列)七、小结
关键要点:
- NumPy 数组类型一致,内存连续,计算速度极快。
shape属性决定了数组的结构。- 运算默认是对每个元素进行操作。
- 多维切片使用逗号分隔
[row, col]。
八、课后作业
- 成绩处理:创建一个 5x3 的随机整数数组(范围 50-100),模拟 5 个学生 3 门课的成绩。
- 计算每个学生的平均分。
- 计算每门课的最高分。
- 棋盘生成:创建一个 8x8 的矩阵,生成国际象棋棋盘的图案(0为黑,1为白,交替出现)。提示:使用切片赋值
arr[::2, ::2] = 1等。 - 图像原理:一张图片本质上就是一个三维数组 (高, 宽, RGB)。尝试用
np.zeros((100, 100, 3), dtype=int)创建一个黑色图片,然后将中间 50x50 的区域全部赋值为[255, 0, 0](红色)。
下节预告
Day 47:NumPy 进阶 - 维度变换与布尔索引- 数组形状不合适怎么变?怎么快速筛选出大于 60 分的成绩?明天我们继续深入 NumPy。
系列导航:
- 上一篇:Day 45 - 进阶篇总结与展望
- 下一篇:Day 47 - NumPy进阶(待更新)