Hello-Python数据分析:NumPy科学计算基础
引言:为什么NumPy是Python数据分析的基石?
你是否曾因Python列表的数值计算效率低下而困扰?在处理大规模数据集时,普通Python列表的循环操作是否让你望而却步?本文将带你掌握NumPy(Numerical Python)——Python科学计算的核心库,通过实战案例揭示其如何让数值计算效率提升100倍以上,以及如何成为Pandas、Matplotlib等高级数据分析工具的基础。
读完本文后,你将能够:
- 理解NumPy数组(Array)与Python列表的本质区别
- 掌握NumPy数组的创建、索引与切片操作
- 熟练运用NumPy进行向量化运算
- 解决实际数据分析中的基础数值计算问题
1. NumPy基础:从安装到数组创建
1.1 安装NumPy
在Hello-Python项目环境中,通过Python包管理器(PIP)安装NumPy的命令如下:
# 安装NumPy
pip install numpy
# 验证安装版本
import numpy
print(numpy.version.version) # 输出示例: 1.26.0
提示:Hello-Python项目的
Intermediate/08_python_package_manager.py文件中已包含NumPy的安装与基础使用示例
1.2 NumPy数组 vs Python列表:性能对比
| 特性 | NumPy数组 | Python列表 |
|---|---|---|
| 存储方式 | 连续内存块,同类型元素 | 非连续内存,可存储不同类型 |
| 计算方式 | 向量化操作(无需循环) | 元素级循环操作 |
| 内存占用 | 低(约为列表的1/4) | 高 |
| 计算速度 | 快(C语言实现) | 慢(Python解释执行) |
性能测试代码:
import numpy as np
import time
# 创建大型数组/列表
size = 10_000_000
python_list = list(range(size))
numpy_array = np.array(python_list)
# 测试Python列表计算时间
start = time.time()
python_result = [x * 2 for x in python_list]
list_time = time.time() - start
# 测试NumPy数组计算时间
start = time.time()
numpy_result = numpy_array * 2
numpy_time = time.time() - start
print(f"Python列表耗时: {list_time:.4f}秒")
print(f"NumPy数组耗时: {numpy_time:.4f}秒")
print(f"NumPy速度提升: {list_time/numpy_time:.1f}倍")
注:在Hello-Python项目的 Intermediate 目录下,可创建
numpy_performance_test.py文件运行上述代码
1.3 创建NumPy数组的常用方法
import numpy as np
# 1. 从Python列表创建
list_data = [35, 24, 62, 52, 30, 30, 17]
array_from_list = np.array(list_data)
print("从列表创建:", array_from_list)
# 2. 创建特殊数组
zeros_array = np.zeros(5) # [0. 0. 0. 0. 0.]
ones_array = np.ones(5) # [1. 1. 1. 1. 1.]
range_array = np.arange(10) # [0 1 2 3 4 5 6 7 8 9]
linspace_array = np.linspace(0, 10, 5) # [ 0. 2.5 5. 7.5 10. ]
# 3. 创建多维数组
two_d_array = np.array([[1, 2, 3], [4, 5, 6]])
print("二维数组形状:", two_d_array.shape) # (2, 3)
2. NumPy数组操作:索引、切片与重塑
2.1 数组索引与切片
import numpy as np
data = np.array([10, 20, 30, 40, 50, 60, 70])
# 基础索引(同Python列表)
print(data[0]) # 10(第一个元素)
print(data[-1]) # 70(最后一个元素)
# 切片操作
print(data[2:5]) # [30 40 50](从索引2到4)
print(data[:3]) # [10 20 30](前三个元素)
print(data[4:]) # [50 60 70](从索引4到末尾)
# 多维数组索引
two_d_data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(two_d_data[1, 2]) # 6(第二行第三列)
print(two_d_data[:, 1]) # [2 5 8](所有行的第二列)
2.2 数组重塑与转置
import numpy as np
# 创建1-12的一维数组
data = np.arange(1, 13)
print("原始数组:", data) # [ 1 2 3 4 5 6 7 8 9 10 11 12]
# 重塑为3行4列的二维数组
reshaped = data.reshape(3, 4)
print("重塑后:\n", reshaped)
"""
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
"""
# 转置数组(行变列,列变行)
transposed = reshaped.T
print("转置后:\n", transposed)
"""
[[ 1 5 9]
[ 2 6 10]
[ 3 7 11]
[ 4 8 12]]
"""
3. 向量化运算:NumPy的核心优势
3.1 基本向量化运算
import numpy as np
# Hello-Python项目中的示例(源自Intermediate/08_python_package_manager.py)
numpy_array = np.array([35, 24, 62, 52, 30, 30, 17])
# 向量化乘法(无需循环)
print(numpy_array * 2) # [70 48 124 104 60 60 34]
# 其他向量化运算
print(numpy_array + 10) # [45 34 72 62 40 40 27]
print(numpy_array **2) # [1225 576 3844 2704 900 900 289]
print(numpy_array > 30) # [ True False True True False False False]
3.2 统计函数与聚合操作
import numpy as np
data = np.array([35, 24, 62, 52, 30, 30, 17])
# 基本统计量
print("总和:", data.sum()) # 250
print("平均值:", data.mean()) # 35.714...
print("最大值:", data.max()) # 62
print("最小值:", data.min()) # 17
print("标准差:", data.std()) # 15.36...
print("中位数:", np.median(data)) # 30.0
# 多维数组统计
two_d_data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print("按行求和:", two_d_data.sum(axis=1)) # [ 6 15 24]
print("按列求平均:", two_d_data.mean(axis=0)) # [4. 5. 6.]
4. 实战案例:使用NumPy分析学生成绩数据
4.1 案例背景
假设我们有一组学生成绩数据(保存在Hello-Python项目的Intermediate/my_file.csv中),包含5名学生的3门课程成绩,我们需要使用NumPy进行基本统计分析。
4.2 数据准备与加载
import numpy as np
# 假设CSV数据格式如下(实际可使用np.loadtxt读取):
# 语文,数学,英语
# 85,92,78
# 76,88,90
# 92,78,85
# 60,65,70
# 88,90,95
# 手动创建成绩数组(实际项目中可使用np.loadtxt读取文件)
scores = np.array([
[85, 92, 78],
[76, 88, 90],
[92, 78, 85],
[60, 65, 70],
[88, 90, 95]
])
4.3 数据分析实现
# 计算每门课程的平均分
course_avg = scores.mean(axis=0)
print(f"语文平均分: {course_avg[0]:.1f}") # 语文平均分
print(f"数学平均分: {course_avg[1]:.1f}") # 数学平均分
print(f"英语平均分: {course_avg[2]:.1f}") # 英语平均分
# 计算每个学生的总分
student_total = scores.sum(axis=1)
for i, total in enumerate(student_total):
print(f"学生{i+1}总分: {total}")
# 找出每门课程的最高分和最低分
course_max = scores.max(axis=0)
course_min = scores.min(axis=0)
print(f"语文最高分: {course_max[0]}, 最低分: {course_min[0]}")
print(f"数学最高分: {course_max[1]}, 最低分: {course_min[1]}")
print(f"英语最高分: {course_max[2]}, 最低分: {course_min[2]}")
# 计算成绩排名(按总分)
rank = student_total.argsort()[::-1] # 降序排序的索引
print("学生排名(从高到低):", [i+1 for i in rank])
4.4 可视化分析结果(概念展示)
# 以下为概念代码,实际可视化需结合Matplotlib
# 这里使用NumPy计算数据,为可视化做准备
# 计算各分数段人数(0-59, 60-79, 80-89, 90-100)
math_scores = scores[:, 1] # 获取所有学生的数学成绩
bins = [0, 59, 79, 89, 100]
histogram = np.histogram(math_scores, bins=bins)[0]
print("数学成绩分布:")
print(f"不及格(0-59): {histogram[0]}人")
print(f"及格(60-79): {histogram[1]}人")
print(f"良好(80-89): {histogram[2]}人")
print(f"优秀(90-100): {histogram[3]}人")
5. NumPy高级功能简介
5.1 广播机制(Broadcasting)
NumPy的广播机制允许不同形状的数组进行算术运算:
import numpy as np
# 标量与数组运算
a = np.array([1, 2, 3])
print(a + 5) # [6 7 8]
# 不同形状数组运算
b = np.array([[1, 2, 3], [4, 5, 6]])
c = np.array([10, 20, 30])
print(b + c)
"""
[[11 22 33]
[14 25 36]]
"""
5.2 线性代数基础
NumPy提供了基础的线性代数运算功能:
import numpy as np
# 矩阵乘法
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
print("矩阵乘法:\n", A @ B) # 等同于np.dot(A, B)
"""
[[19 22]
[43 50]]
"""
# 矩阵求逆(需为方阵)
A_inv = np.linalg.inv(A)
print("矩阵A的逆:\n", A_inv)
6. 总结与进阶学习路径
6.1 本文核心知识点回顾
- NumPy数组是高效存储和处理数值数据的基础结构
- 向量化运算避免了Python循环,大幅提升计算效率
- 数组索引、切片和重塑是数据预处理的基础操作
- 统计函数和聚合操作可快速获取数据分布特征
- 广播机制和线性代数功能扩展了数值计算能力
6.2 Hello-Python项目中的NumPy练习建议
1.** 基础练习 :修改Intermediate/08_python_package_manager.py,添加更多NumPy数组操作 2. 中级挑战 :使用NumPy分析Intermediate/my_file.json中的数据 3. 高级项目 **:结合NumPy和文件处理(Intermediate/06_file_handling.py),实现一个简单的数据分析工具
6.3 进阶学习资源
- NumPy官方文档:https://numpy.org/doc/
- Hello-Python项目后续内容:Pandas基础(
docs/pandas_basics_tutorial.md) - 实践方向:数值模拟、机器学习算法实现、科学计算可视化
附录:NumPy常用函数速查表
| 类别 | 常用函数 |
|---|---|
| 数组创建 | np.array(), np.zeros(), np.ones(), np.arange(), np.linspace() |
| 形状操作 | reshape(), T, flatten(), ravel() |
| 数学运算 | add(), subtract(), multiply(), divide(), power() |
| 统计函数 | sum(), mean(), max(), min(), std(), median() |
| 线性代数 | dot(), inv(), det(), eig(), svd() |
| 逻辑运算 | logical_and(), logical_or(), greater(), less() |
通过掌握这些基础函数,你将能够应对大多数基础数据分析场景,为进一步学习Pandas等高级工具打下坚实基础。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



