Python and NumPy Python和NumPy是机器学习的基础工具

Python和NumPy基础

学习目标

完成本模块学习后,你将能够:

  • 掌握Python基本语法和数据结构
  • 理解NumPy的核心概念和操作
  • 使用NumPy进行科学计算
  • 处理多维数组数据

1. Python基础

1.1 基本数据类型

# 数值类型
x = 42           # 整数
y = 3.14         # 浮点数
z = 1 + 2j      # 复数

# 字符串
text = "Hello, World!"
multiline = """
多行
文本
"""

# 布尔值
is_true = True
is_false = False

# 空值
nothing = None

1.2 数据结构

# 列表
numbers = [1, 2, 3, 4, 5]
mixed = [1, "two", 3.0, [4, 5]]

# 元组
coordinates = (10, 20)
point = (1,)  # 单元素元组

# 字典
person = {
    "name": "Alice",
    "age": 25,
    "skills": ["Python", "ML"]
}

# 集合
unique_numbers = {1, 2, 3, 3, 2, 1}  # 结果:{1, 2, 3}

1.3 控制流

# if条件语句
def check_number(x):
    if x > 0:
        return "正数"
    elif x < 0:
        return "负数"
    else:
        return "零"

# for循环
def sum_list(numbers):
    total = 0
    for num in numbers:
        total += num
    return total

# while循环
def countdown(n):
    while n > 0:
        print(n)
        n -= 1

1.4 函数和类

# 函数定义
def greet(name, greeting="Hello"):
    """函数文档字符串"""
    return f"{greeting}, {name}!"

# 类定义
class Rectangle:
    def __init__(self, width, height):
        self.width = width
        self.height = height
    
    def area(self):
        return self.width * self.height
    
    @property
    def perimeter(self):
        return 2 * (self.width + self.height)

2. NumPy基础

2.1 创建数组

import numpy as np

# 从列表创建
arr1 = np.array([1, 2, 3, 4, 5])
arr2 = np.array([[1, 2, 3], [4, 5, 6]])

# 特殊数组
zeros = np.zeros((3, 4))       # 全0数组
ones = np.ones((2, 3))         # 全1数组
rand = np.random.rand(2, 2)    # 随机数组
arange = np.arange(10)         # 序列数组
linspace = np.linspace(0, 1, 5)  # 等间隔数组

2.2 数组操作

# 形状操作
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr.shape)          # 形状
print(arr.reshape(3, 2))  # 重塑
print(arr.T)             # 转置

# 索引和切片
print(arr[0, 1])         # 单元素
print(arr[:, 1])         # 列切片
print(arr[0, :])         # 行切片

# 条件索引
mask = arr > 3
print(arr[mask])         # 条件选择

2.3 数组运算

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

print(a + b)    # 加法
print(a * b)    # 乘法
print(a ** 2)   # 幂运算
print(np.sqrt(a))  # 开方

# 统计运算
print(arr.sum())       # 求和
print(arr.mean())      # 平均值
print(arr.std())       # 标准差
print(arr.min())       # 最小值
print(arr.max())       # 最大值

2.4 广播机制

# 广播示例
arr = np.array([[1, 2, 3],
                [4, 5, 6]])
scalar = 2
vector = np.array([10, 20, 30])

print(arr + scalar)      # 数组加标量
print(arr + vector)      # 数组加向量

2.5 线性代数运算

# 矩阵运算
a = np.array([[1, 2], [3, 4]])
b = np.array([[5, 6], [7, 8]])

print(np.dot(a, b))      # 矩阵乘法
print(np.linalg.inv(a))  # 矩阵求逆
print(np.linalg.det(a))  # 行列式
print(np.linalg.eig(a))  # 特征值和特征向量

3. 实战练习

3.1 图像处理

def process_image():
    # 创建简单图像
    image = np.zeros((100, 100))
    image[25:75, 25:75] = 1
    
    # 旋转
    rotated = np.rot90(image)
    
    # 翻转
    flipped = np.flipud(image)
    
    return image, rotated, flipped

# 显示图像
import matplotlib.pyplot as plt

def show_images(images):
    fig, axes = plt.subplots(1, len(images))
    for ax, img in zip(axes, images):
        ax.imshow(img, cmap='gray')
        ax.axis('off')
    plt.show()

3.2 数据分析

def analyze_data():
    # 生成示例数据
    data = np.random.normal(size=(1000, 5))
    
    # 基本统计
    stats = {
        'mean': np.mean(data, axis=0),
        'std': np.std(data, axis=0),
        'min': np.min(data, axis=0),
        'max': np.max(data, axis=0)
    }
    
    # 相关性矩阵
    corr = np.corrcoef(data.T)
    
    return stats, corr

def plot_correlation_matrix(corr):
    plt.imshow(corr, cmap='coolwarm')
    plt.colorbar()
    plt.xticks(range(len(corr)))
    plt.yticks(range(len(corr)))
    plt.show()

4. 性能优化

4.1 向量化操作

# 不推荐的循环方式
def slow_sum(arr1, arr2):
    result = np.zeros_like(arr1)
    for i in range(len(arr1)):
        result[i] = arr1[i] + arr2[i]
    return result

# 推荐的向量化方式
def fast_sum(arr1, arr2):
    return arr1 + arr2

4.2 内存优化

# 使用视图而不是复制
def optimize_memory():
    large_array = np.random.rand(1000000)
    
    # 视图 - 共享内存
    view = large_array.view()
    
    # 复制 - 新内存
    copy = large_array.copy()
    
    return view, copy

常见问题解答

Q: Python列表和NumPy数组的区别? A: 主要区别:

  • NumPy数组支持向量化操作
  • NumPy数组内存效率更高
  • NumPy数组元素类型必须相同
  • NumPy提供更多数学运算功能

Q: 如何选择合适的NumPy数据类型? A: 考虑以下因素:

  • 数值范围
  • 精度要求
  • 内存限制
  • 计算效率

Q: 如何提高NumPy代码性能? A: 可以采用以下策略:

  • 使用向量化操作
  • 避免不必要的复制
  • 使用适当的数据类型
  • 利用内置函数

扩展阅读