NumPy 教程(长文解析)

什么是 NumPy?为什么它在数据科学中如此重要?

在 Python 编程的世界里,处理数值数据是一项常见任务。无论是分析一组学生考试成绩,还是处理图像像素值,我们都需要一种高效的方式来操作数字集合。这时,NumPy 就成了必不可少的工具。

NumPy 是一个强大的 Python 库,全称为 Numerical Python。它的核心是一个名为 ndarray 的多维数组对象,这个对象不仅支持高效的数值运算,还提供了丰富的数学函数接口。简单来说,NumPy 就像是 Python 的“数值计算引擎”,让原本缓慢的列表操作变得飞快。

你可以把 NumPy 想象成一个智能的电子表格,但它比 Excel 更强大、更灵活。它不仅能处理二维数据(如表格),还能轻松应对三维甚至更高维度的数据(比如视频帧、医学扫描切片)。这种能力在机器学习、图像处理、科学计算等领域至关重要。

如果你正在学习数据分析或机器学习,那么掌握 NumPy 就像学会了开车前必须学会踩油门和刹车。它不仅是基础,更是后续学习 TensorFlow、Pandas、Scikit-learn 等库的基石。


创建数组与初始化

在使用 NumPy 之前,第一步就是创建数组。这就像准备一个空盒子,用来装你的数据。

最常用的方式是使用 np.array() 函数,它能从 Python 列表或元组中创建一个 NumPy 数组。

import numpy as np

data = [1, 2, 3, 4, 5]
arr_1d = np.array(data)

print(arr_1d)

matrix = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
arr_2d = np.array(matrix)

print(arr_2d)

注意:所有元素必须是相同类型。如果混合了整数和浮点数,NumPy 会自动将整数转换为浮点数。

此外,NumPy 提供了一些便捷函数来快速生成特定形状的数组:

zeros = np.zeros((3, 4))  # 3行4列
print(zeros)

ones = np.ones((2, 3))
print(ones)

identity = np.eye(3)
print(identity)

linspace = np.linspace(0, 10, 5)  # 从0到10,生成5个数
print(linspace)

logspace = np.logspace(1, 3, 4)  # 10^1 到 10^3,共4个数
print(logspace)

这些函数让你无需手动写循环就能快速构造测试数据,极大提升开发效率。


数组的基本属性与索引操作

每个 NumPy 数组都有几个关键属性,了解它们能帮你更好地掌控数据。

arr = np.array([[1, 2, 3], [4, 5, 6]])

print("维度:", arr.ndim)        # 输出: 2

print("形状:", arr.shape)       # 输出: (2, 3)

print("元素总数:", arr.size)    # 输出: 6

print("数据类型:", arr.dtype)   # 输出: int64

print("每个元素字节数:", arr.itemsize)  # 输出: 8(int64 占8字节)

索引操作是数组的核心能力之一。NumPy 支持类似 Python 列表的索引方式,但更强大。

arr = np.array([10, 20, 30, 40, 50])

print(arr[0])   # 输出: 10
print(arr[-1])  # 输出: 50(最后一个元素)

print(arr[1:4])  # 输出: [20 30 40](从第1个到第3个,不包含第4个)

matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])

print(matrix[0, :])      # 输出: [1 2 3]

print(matrix[:, 1])      # 输出: [2 5 8]

print(matrix[1:3, 0:2])

你还可以用布尔值进行高级索引,这在筛选数据时特别有用。

data = np.array([15, 25, 35, 45, 55])

mask = data > 30
print(mask)            # 输出: [False False  True  True  True]

filtered = data[mask]
print(filtered)        # 输出: [35 45 55]

这种“条件筛选”的方式比传统循环更简洁、更高效。


数组的数学运算与广播机制

NumPy 最令人惊艳的地方在于它的向量化运算能力。你不需要写 for 循环,就能对整个数组进行加减乘除。

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])

print(a + b)      # 输出: [5 7 9]
print(a - b)      # 输出: [-3 -3 -3]
print(a * b)      # 输出: [4 10 18]
print(a / b)      # 输出: [0.25 0.4  0.5 ]

print(a ** 2)     # 输出: [1 4 9]

angles = np.array([0, np.pi/2, np.pi])
print(np.sin(angles))  # 输出: [0.0 1.0 0.0]

更厉害的是“广播机制”(Broadcasting)。它允许不同形状的数组进行运算,只要满足一定规则。

arr = np.array([1, 2, 3])
print(arr + 10)     # 输出: [11 12 13]

matrix = np.array([[1, 2], [3, 4]])
vec = np.array([10, 20])

print(matrix + vec)

广播规则可以理解为:如果两个数组在某个维度上的大小相同,或其中一个为1,就可以进行运算。这个机制让代码简洁且高效。


高级操作:重塑、合并与分割

在实际项目中,我们经常需要调整数组的形状或合并多个数组。

重塑(Reshape)

arr = np.arange(12)  # 创建0到11的数组
print(arr)           # 输出: [ 0  1  2  3  4  5  6  7  8  9 10 11]

reshaped = arr.reshape(3, 4)
print(reshaped)

注意:新形状的总元素数必须等于原数组。

合并操作

a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])

hstacked = np.hstack((a, b))
print(hstacked)

vstacked = np.vstack((a, b))
print(vstacked)

分割操作

matrix = np.array([[1, 2, 3, 4], [5, 6, 7, 8]])

split_cols = np.hsplit(matrix, 2)
print(split_cols[0])  # 第一部分

split_rows = np.vsplit(matrix, 2)
print(split_rows[1])  # 第二部分

这些操作在数据预处理阶段非常常见,比如把原始数据按特征拆分、合并多个样本等。


实战案例:分析学生成绩数据

让我们用一个真实场景来展示 NumPy 的威力。

假设你有一组学生的数学和英语成绩,需要计算平均分、最高分和及格率。

scores = np.array([
    [85, 90],
    [78, 82],
    [92, 88],
    [65, 70],
    [88, 95]
])

math_avg = np.mean(scores[:, 0])   # 选中所有学生的数学成绩
english_avg = np.mean(scores[:, 1])

print(f"数学平均分: {math_avg:.2f}")
print(f"英语平均分: {english_avg:.2f}")

math_max = np.max(scores[:, 0])
english_max = np.max(scores[:, 1])

print(f"数学最高分: {math_max}")
print(f"英语最高分: {english_max}")

math_pass_rate = np.mean(scores[:, 0] >= 60)
english_pass_rate = np.mean(scores[:, 1] >= 60)

print(f"数学及格率: {math_pass_rate:.2%}")
print(f"英语及格率: {english_pass_rate:.2%}")

输出结果:

数学平均分: 80.80
英语平均分: 85.00
数学最高分: 92
英语最高分: 95
数学及格率: 100.00%
英语及格率: 100.00%

整个过程只用了几行代码,没有写任何 for 循环。这就是 NumPy 的强大之处——用简洁的表达完成复杂的计算任务。


总结:NumPy 教程的核心价值

通过这篇详细的 NumPy 教程,我们从基础创建、索引操作、数学运算,到高级合并分割和实际案例,全面了解了这个库的强大功能。

NumPy 不仅是科学计算的基石,更是现代数据分析流程的起点。它用高效的底层实现(C 语言编写),让 Python 能够处理大规模数值数据,而无需牺牲可读性。

对于初学者,建议先掌握数组创建、基本运算和索引;中级开发者则可深入研究广播机制、向量化操作和内存管理技巧。

当你熟练使用 NumPy 后,你会发现 Pandas、Scikit-learn、PyTorch 等库的底层逻辑都建立在它的之上。因此,投入时间学习 NumPy,是一次值得的投资。

如果你正在寻找一个高效、稳定、功能完整的数值计算工具,NumPy 绝对是你的首选。掌握它,就是掌握数据科学的“内功心法”。