如果你刚接触 Python 数据分析,一定听过「NumPy」这个名字。作为 Python 科学计算的基石,它几乎是所有数据处理、机器学习、科学研究的必备工具。
一、为什么选择 NumPy?
举个例子,如果要计算一个包含 100 万个元素的列表中每个元素的平方,用 Python 列表和 NumPy 分别需要多久?
我们用代码实测一下(可以自己复制运行):
import time
import numpy as np
# 创建一个包含100万个元素的列表
python_list = list(range(1, 1000001))
# 转换为NumPy数组
numpy_arr = np.array(python_list)
# 测试列表循环计算平方的时间
start = time.time()
python_result = [x**2 for x in python_list]
print(f"列表耗时:{time.time() - start:.4f}秒")
# 测试NumPy数组矢量化计算的时间
start = time.time()
numpy_result = numpy_arr **2
print(f"NumPy耗时:{time.time() - start:.4f}秒")
运行结果是:
Python耗时:0.0872秒
NumPy耗时:0.0005秒
差距达 174 倍(100 万元素计算),数据量越大,NumPy 优势越明显。
因 Python 列表是动态类型集合,需逐个遍历;而 NumPy 的 ndarray 为同构数据容器,基于 C 实现,支持整组运算,效率有明显差异。
加之其丰富的数学函数,使其成为数据分析基础。
二、安装 NumPy:3 步搞定环境配置
1. 安装方式
用 pip 管理包:
pip install numpy
如果安装速度慢,直接复制下面代码在cmd中输入,后面网址为清华园镜像
pip install numpy -i
https://pypi.tuna.tsinghua.edu.cn/simple
2. 验证安装是否成功
打开 命令行,输入:
pip show numpy
如果没有报错,且能显示版本号,说明安装成功。
三、NumPy 核心:理解 ndarray 数组
NumPy 的一切操作都围绕「ndarray」(N-dimensional array,N 维数组)展开。
1. ndarray 的 3 个核心属性
每个 ndarray 都有 3 个关键属性:
ndim :维度数量。
shape :各维度的大小(如 (3,4) 表示 3 行 4 列的 2 维数组)。
dtype **:数组中元素的数据类型(如 int32、float64)。
2. 为什么 dtype 很重要?
和 Python 列表不同,ndarray 中的元素必须是同一种数据类型。指定 dtype 有两个好处:
--节省内存 :比如存储整数时,int32(4 字节)比默认的 int64(8 字节)节省一半空间。
--避免计算错误:比如 float32 和 float64 的精度不同,可能影响科学计算结果。
常用 dtype 包括:int32、int64、float32、float64、bool 等。
四、快速上手:创建数组的 3 种常用方法
1. 从 Python 列表创建
用 np.array() 函数,直接把列表转换成 ndarray:
import numpy as np
# 1 维数组(向量)
arr1 = np.array([1, 2, 3, 4])
print(arr1) # 输出:[1 2 3 4]
print("ndim:", arr1.ndim) # 输出:1
print("shape:", arr1.shape) # 输出:(4,)
print("dtype:", arr1.dtype) # 输出:int64(默认整数类型)
# 2 维数组(矩阵)
arr2 = np.array([[1, 2, 3], [4, 5, 6]])
print(arr2)
# 输出:
# [[1 2 3]
# [4 5 6]]
print("shape:", arr2.shape) # 输出:(2, 3)(2 行 3 列)
创建时可指定 dtype,比如强制为浮点型:
arr = np.array([1, 2, 3], dtype=np.float32)
print(arr.dtype) # 输出:float32
2. 创建全 0 或全 1 数组
用 np.zeros() 或 np.ones(),指定 shape 即可:
# 创建 2 行 3 列的全 0 数组
zeros_arr = np.zeros((2, 3))
print(zeros_arr)
# [[0. 0. 0.]
# [0. 0. 0.]]
# 创建 3 个元素的全 1 数组(1 维)
ones_arr = np.ones(3, dtype=int) # 强制为整数
print(ones_arr) # 输出:[1 1 1]
3. 创建连续序列数组(类似 range)
用 np.arange(),用法和 Python 的 range 类似,但返回的是 ndarray对象:
五、ndarray 基础操作:索引、切片与修改
和 Python 列表类似,ndarray 也支持索引(取单个元素)和切片(取部分元素),但用法更灵活。
1. 1 维数组操作(和列表几乎一样)
arr = np.arange(10) # [0 1 2 3 4 5 6 7 8 9]
# 取索引为 3 的元素(第 4 个元素,从 0 开始计数)
print(arr[3]) # 输出:3
# 切片:取索引 2 到 5(不包含 5)的元素
print(arr[2:5]) # 输出:[2 3 4]
# 修改元素值
arr[4] = 100
print(arr) # 输出:[ 0 1 2 3 100 5 6 7 8 9]
2. 2 维数组操作(矩阵思维)
2 维数组的索引需要用 [行, 列] 的形式(注意是逗号分隔,不是 [行][列]):
arr = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]) # shape=(3,3)
# 取第 1 行(索引 0)的第 2 列(索引 1)元素
print(arr[0, 1]) # 输出:2
# 取第 2 行(索引 1)的所有元素
print(arr[1, :]) # 输出:[4 5 6](`:` 表示取所有列)
# 取所有行的第 0 列元素
print(arr[:, 0]) # 输出:[1 4 7]
# 切片:取前 2 行,前 2 列
print(arr[:2, :2])
# 输出:
# [[1 2]
# [4 5]]
# 修改元素:将第 2 行第 2 列(索引 2,2)改为 100
arr[2, 2] = 100
print(arr)
# 输出:
# [[ 1 2 3]
# [ 4 5 6]
# [ 7 8 100]]
六、实战小案例:用 NumPy 处理班级成绩
假设你是老师,手里有一个班级 5 名学生的 3 门成绩(数学、语文、英语),用 NumPy 快速计算平均分、最高分等统计量。
步骤 1:创建成绩数组
# 5 名学生,3 门成绩:[[数学], [语文], [英语]]
scores = np.array([
[90, 85, 92], # 学生 1
[78, 90, 88], # 学生 2
[95, 89, 96], # 学生 3
[82, 76, 80], # 学生 4
[88, 92, 85] # 学生 5
])
print("成绩矩阵 shape:", scores.shape) # 输出:(5, 3)(5 行 3 列)
步骤 2:计算统计量
# 1. 计算每门课的平均分(按列求平均)
subject_avg = scores.mean(axis=0) # axis=0 表示按照每列计算(顺着行)
print("数学平均分:", subject_avg[0]) # 输出:86.6
print("语文平均分:", subject_avg[1]) # 输出:86.4
print("英语平均分:", subject_avg[2]) # 输出:88.2
# 2. 计算每个学生的总分(按行求和)
student_total = scores.sum(axis=1) # axis=1 表示按每行计算(顺着列)
print("学生总分:", student_total) # 输出:[267 256 280 238 265]
# 3. 找出英语最高分(第 2 列,索引 2)
english_max = scores[:, 2].max()
print("英语最高分:", english_max) # 输出:96
axis 参数控制计算方向 ——axis=0 是「列方向」(跨所有行),axis=1 是「行方向」(跨所有列)。
七、总结
1.为什么用 NumPy ?比 Python 列表快 100+ 倍,支持向量运算和批量操作。
2. 核心结构 :ndarray 数组,用 ndim(维度)、shape(形状)、dtype(数据类型)描述。
3. 常用创建方法 :np.array()(从列表创建)、np.zeros()(全 0)、np.arange()(连续序列)。
4. 基础操作 :索引 [i,j]、切片 [start:end]、修改值直接赋值。
5. 实战:一行代码完成统计计算(如 mean()、sum()),用axis 控制方向。