🔰NumPy从入门到精通

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的根基,理解它的属性至关重要。

  • 创建方式 :可以从列表创建,也可以用内置函数快速生成特殊数组。

    python 复制代码
    zeros_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列表类似,但功能更强大。

    python 复制代码
    arr = 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]] (前两行,后两列)
  • 形状变换

    python 复制代码
    arr = np.arange(6) # [0, 1, 2, 3, 4, 5]
    reshaped = arr.reshape((2, 3)) # 变为2行3列
    flattened = arr.ravel()        # 展平为一维

🚀 进阶篇:掌握核心生产力

1. 向量化运算与通用函数

向量化是用数组表达式代替循环,性能可提升数十倍甚至上百倍。

  • 数组与标量的运算 :广播到每个元素。

    python 复制代码
    arr = np.array([1, 2, 3])
    print(arr + 10)   # [11 12 13]
    print(arr * 2)    # [2 4 6]
  • 数组与数组的运算:对应元素运算,要求形状相同或可广播。

  • 通用函数(ufunc) :对数组进行逐元素操作的函数。

    python 复制代码
    arr = 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. 高级索引:花式索引与布尔索引

  • 花式索引 :用整数数组或列表作为索引,按指定顺序选取。

    python 复制代码
    arr = np.array([10, 20, 30, 40, 50])
    indices = [0, 3, 4]
    print(arr[indices]) # [10 40 50]
  • 布尔索引 :用条件筛选数据,非常常用。

    python 复制代码
    arr = 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上有许多开源的实践项目可供参考。