NumPy(Numerical Python)是Python科学计算生态的基石,几乎所有主流的数据分析、机器学习库(如Pandas、Scikit-learn、PyTorch)都构建于其上。掌握NumPy,核心是围绕其高性能的多维数组对象(ndarray) ,理解其向量化运算 和广播机制。
🔰 入门篇:打好地基
1. 环境搭建与第一个程序
安装非常简单,使用pip或conda即可:
bash
pip install numpy
# 或 conda install numpy
验证安装,并开始你的第一个向量化运算示例:
python
import numpy as np
# 从列表创建数组
arr = np.array([1, 2, 3, 4, 5])
# 向量化运算:对每个元素求平方,无需写循环
squared = arr ** 2
print(f"原始数组: {arr}") # 输出: [1 2 3 4 5]
print(f"平方结果: {squared}") # 输出: [ 1 4 9 16 25]
print(f"平均值: {np.mean(arr)}") # 输出: 3.0
2. 核心数据结构:ndarray
ndarray是NumPy的根基,理解它的属性至关重要。
-
创建方式 :可以从列表创建,也可以用内置函数快速生成特殊数组。
pythonzeros_arr = np.zeros((3, 4)) # 3行4列的全0数组 ones_arr = np.ones((2, 3)) # 2行3列的全1数组 eye_arr = np.eye(5) # 5x5的单位矩阵 range_arr = np.arange(0, 10, 2) # 类似range,生成 [0, 2, 4, 6, 8] lin_arr = np.linspace(0, 1, 5) # 在0和1之间生成5个等间隔点 -
重要属性 :
arr.ndim:数组的维度(轴的数量)。arr.shape:数组的形状,如(3, 4)代表3行4列。arr.size:元素总个数。arr.dtype:元素的数据类型(如int64,float64)。
3. 基础操作:索引、切片与形状变换
-
索引与切片 :与Python列表类似,但功能更强大。
pythonarr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) print(arr[0, 1]) # 输出: 2 (第0行第1列) print(arr[:2, 1:]) # 输出: [[2 3] [5 6]] (前两行,后两列) -
形状变换 :
pythonarr = np.arange(6) # [0, 1, 2, 3, 4, 5] reshaped = arr.reshape((2, 3)) # 变为2行3列 flattened = arr.ravel() # 展平为一维
🚀 进阶篇:掌握核心生产力
1. 向量化运算与通用函数
向量化是用数组表达式代替循环,性能可提升数十倍甚至上百倍。
-
数组与标量的运算 :广播到每个元素。
pythonarr = np.array([1, 2, 3]) print(arr + 10) # [11 12 13] print(arr * 2) # [2 4 6] -
数组与数组的运算:对应元素运算,要求形状相同或可广播。
-
通用函数(ufunc) :对数组进行逐元素操作的函数。
pythonarr = np.array([1, 4, 9, 16]) print(np.sqrt(arr)) # 平方根: [1. 2. 3. 4.] print(np.exp(arr)) # 指数: [2.718...] print(np.sin(arr)) # 三角函数
2. 广播机制
广播让不同形状的数组也能进行运算。规则是:从后往前比较两个数组的形状,如果维度相等或其中一个为1,则兼容,NumPy会自动复制缺失维度的数据。
python
# 形状 (4, 3) 与 形状 (3,) 相加
A = np.array([[0, 0, 0], [1, 1, 1], [2, 2, 2], [3, 3, 3]])
B = np.array([1, 2, 3])
print(A + B)
# B会自动广播为 [[1,2,3], [1,2,3], [1,2,3], [1,2,3]]
# 结果为:
# [[1 2 3]
# [2 3 4]
# [3 4 5]
# [4 5 6]]
3. 高级索引:花式索引与布尔索引
-
花式索引 :用整数数组或列表作为索引,按指定顺序选取。
pythonarr = np.array([10, 20, 30, 40, 50]) indices = [0, 3, 4] print(arr[indices]) # [10 40 50] -
布尔索引 :用条件筛选数据,非常常用。
pythonarr = np.array([1, 2, 3, 4, 5, 6]) mask = arr > 3 print(arr[mask]) # [4 5 6]
🎯 实战演练:数据分析小项目
我们模拟分析公司过去12个月的销售额:
python
import numpy as np
# 1. 创建销售数据(单位:万元)
monthly_sales = np.array([120, 135, 128, 142, 156, 148, 163, 175, 169, 182, 195, 188])
# 2. 计算统计指标
mean_sales = np.mean(monthly_sales)
std_sales = np.std(monthly_sales)
max_sales = np.max(monthly_sales)
print(f"平均销售额: {mean_sales:.2f} 万元")
print(f"标准差: {std_sales:.2f} 万元")
# 3. 计算环比增长率(后一个月较前一个月增长率)
growth_rates = np.diff(monthly_sales) / monthly_sales[:-1] * 100
print("环比增长率:", growth_rates)
# 4. 识别异常月份(超过平均值2个标准差)
threshold = mean_sales + 2 * std_sales
abnormal_months = np.where(monthly_sales > threshold)[0] # 获取索引
print(f"异常月份索引: {abnormal_months}")
📚 持续学习与资源
- 官方中文文档 :最权威、全面的资源,已提供完整的翻译。访问地址:https://www.numpy.org.cn/
- 系统化教程:W3Cschool的NumPy教程也提供了清晰的知识结构。
- 动手实践:在Jupyter Notebook中按部就班地运行代码,是最好的学习方式。GitHub上有许多开源的实践项目可供参考。