NumPy

NumPy 是 Python 中科学计算的基础库,提供了高性能的多维数组和数学运算功能。

安装

pip install numpy

创建数组

import numpy as np

# 从列表创建数组
arr = np.array([1, 2, 3, 4, 5])
print(f"一维数组: {arr}")

# 创建二维数组
matrix = np.array([[1, 2, 3], [4, 5, 6]])
print(f"二维数组:\n{matrix}")

# 创建特定数组
zeros = np.zeros((3, 3))      # 全零数组
ones = np.ones((2, 4))        # 全一数组
random = np.random.rand(3, 3) # 随机数组
range_arr = np.arange(0, 10, 2)  # [0, 2, 4, 6, 8]

print(f"全零数组:\n{zeros}")
print(f"全一数组:\n{ones}")
print(f"随机数组:\n{random}")
print(f"范围数组: {range_arr}")

数组属性

import numpy as np

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

print(f"形状: {arr.shape}")      # (2, 3)
print(f"维度: {arr.ndim}")       # 2
print(f"大小: {arr.size}")       # 6
print(f"数据类型: {arr.dtype}")  # int64
print(f"元素大小: {arr.itemsize} 字节")

数组索引和切片

import numpy as np

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

# 基本索引
print(f"第一个元素: {arr[0]}")      # 0
print(f"最后一个元素: {arr[-1]}")   # 9

# 切片
print(f"前5个元素: {arr[:5]}")      # [0 1 2 3 4]
print(f"后5个元素: {arr[-5:]}")     # [5 6 7 8 9]
print(f"偶数索引: {arr[::2]}")      # [0 2 4 6 8]

# 二维数组索引
matrix = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(f"第一行: {matrix[0, :]}")    # [1 2 3]
print(f"第一列: {matrix[:, 0]}")    # [1 4 7]
print(f"子数组:\n{matrix[0:2, 1:3]}")

数组运算

import numpy as np

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

# 基本运算
print(f"加法: {arr1 + arr2}")      # [ 6  8 10 12]
print(f"减法: {arr1 - arr2}")      # [-4 -4 -4 -4]
print(f"乘法: {arr1 * arr2}")      # [ 5 12 21 32]
print(f"除法: {arr1 / arr2}")      # [0.2 0.333 0.428 0.5]

# 标量运算
print(f"乘以2: {arr1 * 2}")        # [2 4 6 8]
print(f"加10: {arr1 + 10}")        # [11 12 13 14]

# 数学函数
print(f"平方: {np.square(arr1)}")  # [ 1  4  9 16]
print(f"平方根: {np.sqrt(arr1)}")  # [1. 1.414 1.732 2.]
print(f"指数: {np.exp(arr1)}")     # [ 2.718  7.389 20.085 54.598]

# 统计函数
print(f"求和: {np.sum(arr1)}")     # 10
print(f"平均值: {np.mean(arr1)}")  # 2.5
print(f"最大值: {np.max(arr1)}")   # 4
print(f"最小值: {np.min(arr1)}")   # 1
print(f"标准差: {np.std(arr1)}")   # 1.118

数组操作

import numpy as np

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

# 改变形状
matrix = arr.reshape(5, 1)
print(f"重塑后:\n{matrix}")

# 转置
matrix = np.array([[1, 2, 3], [4, 5, 6]])
print(f"转置:\n{matrix.T}")

# 拼接
arr1 = np.array([1, 2, 3])
arr2 = np.array([4, 5, 6])
concatenated = np.concatenate([arr1, arr2])
print(f"拼接: {concatenated}")  # [1 2 3 4 5 6]

# 排序
arr = np.array([3, 1, 4, 1, 5, 9, 2, 6])
sorted_arr = np.sort(arr)
print(f"排序: {sorted_arr}")  # [1 1 2 3 4 5 6 9]

# 去重
unique_arr = np.unique(arr)
print(f"去重: {unique_arr}")  # [1 2 3 4 5 6 9]

广播机制

import numpy as np

# 不同形状的数组可以运算
arr = np.array([[1, 2, 3], [4, 5, 6]])
scalar = 10
print(f"数组 + 标量:\n{arr + scalar}")

# 不同维度的数组
arr1 = np.array([[1], [2], [3]])  # (3, 1)
arr2 = np.array([4, 5, 6])        # (3,)
result = arr1 + arr2
print(f"广播结果:\n{result}")
# [[5 6 7]
#  [6 7 8]
#  [7 8 9]]
💡 提示:NumPy 数组比 Python 列表快得多,特别是在处理大量数据时。

Pandas

Pandas 是 Python 中数据分析的核心库,提供了 DataFrame 和 Series 数据结构,让数据处理变得简单高效。

安装

pip install pandas

创建 DataFrame

import pandas as pd

# 从字典创建
data = {
    '姓名': ['张三', '李四', '王五'],
    '年龄': [25, 30, 35],
    '城市': ['北京', '上海', '广州']
}
df = pd.DataFrame(data)
print(df)

# 从列表创建
data = [
    ['张三', 25, '北京'],
    ['李四', 30, '上海'],
    ['王五', 35, '广州']
]
df = pd.DataFrame(data, columns=['姓名', '年龄', '城市'])
print(df)

# 从 NumPy 数组创建
import numpy as np
arr = np.random.rand(5, 3)
df = pd.DataFrame(arr, columns=['A', 'B', 'C'])
print(df)

读取和写入数据

import pandas as pd

# 读取 CSV 文件
df = pd.read_csv('data.csv')

# 读取 Excel 文件
df = pd.read_excel('data.xlsx')

# 读取 JSON 文件
df = pd.read_json('data.json')

# 写入 CSV 文件
df.to_csv('output.csv', index=False, encoding='utf-8')

# 写入 Excel 文件
df.to_excel('output.xlsx', index=False)

# 写入 JSON 文件
df.to_json('output.json', force_ascii=False, indent=2)

数据查看

import pandas as pd

# 假设 df 是一个 DataFrame
print(f"前5行:\n{df.head()}")
print(f"后5行:\n{df.tail()}")
print(f"基本信息:\n{df.info()}")
print(f"统计信息:\n{df.describe()}")
print(f"列名: {df.columns.tolist()}")
print(f"形状: {df.shape}")
print(f"数据类型:\n{df.dtypes}")

数据选择

import pandas as pd

# 选择列
print(df['姓名'])        # 单列
print(df[['姓名', '年龄']])  # 多列

# 选择行(位置索引)
print(df.iloc[0])       # 第一行
print(df.iloc[0:3])     # 前三行

# 选择行(标签索引)
print(df.loc[0])        # 第一行
print(df.loc[0:2])      # 前三行

# 条件选择
print(df[df['年龄'] > 25])      # 年龄大于25的行
print(df[df['城市'] == '北京']) # 城市为北京的行

# 组合条件
print(df[(df['年龄'] > 25) & (df['城市'] == '上海')])

数据操作

import pandas as pd

# 添加列
df['工资'] = [8000, 10000, 12000]

# 删除列
df = df.drop('工资', axis=1)

# 重命名列
df = df.rename(columns={'姓名': 'name', '年龄': 'age'})

# 排序
df_sorted = df.sort_values('年龄', ascending=False)

# 去重
df_unique = df.drop_duplicates()

# 填充缺失值
df_filled = df.fillna(0)

# 删除缺失值
df_clean = df.dropna()

数据聚合

import pandas as pd

# 按列分组
grouped = df.groupby('城市')
print(f"各城市平均年龄:\n{grouped['年龄'].mean()}")

# 多种聚合
result = df.groupby('城市').agg({
    '年龄': ['mean', 'max', 'min'],
    '工资': 'sum'
})
print(result)

# 计数
count = df['城市'].value_counts()
print(f"城市人数:\n{count}")

数据合并

import pandas as pd

df1 = pd.DataFrame({'姓名': ['张三', '李四'], '年龄': [25, 30]})
df2 = pd.DataFrame({'姓名': ['张三', '李四'], '工资': [8000, 10000]})

# 内连接
merged = pd.merge(df1, df2, on='姓名')
print(merged)

# 左连接
left_join = pd.merge(df1, df2, on='姓名', how='left')
print(left_join)

# 拼接
concatenated = pd.concat([df1, df2], axis=0)  # 纵向拼接
print(concatenated)

时间序列

import pandas as pd

# 创建时间序列
dates = pd.date_range('2026-01-01', periods=7, freq='D')
df = pd.DataFrame({'日期': dates, '值': range(7)})
print(df)

# 设置索引
df = df.set_index('日期')

# 按时间选择
print(df['2026-01-01':'2026-01-03'])

# 重采样
monthly = df.resample('M').sum()
print(monthly)
💡 提示:Pandas 是数据分析和数据科学的基础库,建议深入学习。

Matplotlib

Matplotlib 是 Python 中最流行的数据可视化库,可以创建各种静态、动态和交互式图表。

安装

pip install matplotlib

基本折线图

import matplotlib.pyplot as plt

# 数据
x = [1, 2, 3, 4, 5]
y = [2, 4, 6, 8, 10]

# 创建图表
plt.figure(figsize=(10, 6))
plt.plot(x, y, marker='o', linestyle='-', color='blue', label='数据')

# 添加标题和标签
plt.title('折线图示例', fontsize=16)
plt.xlabel('X 轴', fontsize=12)
plt.ylabel('Y 轴', fontsize=12)

# 添加网格
plt.grid(True, linestyle='--', alpha=0.6)

# 显示图例
plt.legend()

# 显示图表
plt.show()

柱状图

import matplotlib.pyplot as plt

# 数据
categories = ['A', 'B', 'C', 'D', 'E']
values = [23, 45, 56, 78, 32]

# 创建柱状图
plt.figure(figsize=(10, 6))
plt.bar(categories, values, color='skyblue', edgecolor='black')

# 添加标题和标签
plt.title('柱状图示例', fontsize=16)
plt.xlabel('类别', fontsize=12)
plt.ylabel('数值', fontsize=12)

# 在柱子上显示数值
for i, v in enumerate(values):
    plt.text(i, v + 1, str(v), ha='center', va='bottom')

plt.show()

散点图

import matplotlib.pyplot as plt
import numpy as np

# 生成随机数据
np.random.seed(42)
x = np.random.randn(100)
y = np.random.randn(100)
colors = np.random.rand(100)
sizes = 1000 * np.random.rand(100)

# 创建散点图
plt.figure(figsize=(10, 6))
plt.scatter(x, y, c=colors, s=sizes, alpha=0.6, cmap='viridis')

# 添加标题和标签
plt.title('散点图示例', fontsize=16)
plt.xlabel('X 轴', fontsize=12)
plt.ylabel('Y 轴', fontsize=12)

# 添加颜色条
plt.colorbar(label='颜色')

plt.show()

饼图

import matplotlib.pyplot as plt

# 数据
labels = ['A', 'B', 'C', 'D']
sizes = [15, 30, 45, 10]
colors = ['#ff9999', '#66b3ff', '#99ff99', '#ffcc99']
explode = (0, 0.1, 0, 0)  # 突出显示第二块

# 创建饼图
plt.figure(figsize=(10, 6))
plt.pie(sizes, explode=explode, labels=labels, colors=colors,
        autopct='%1.1f%%', shadow=True, startangle=90)

plt.title('饼图示例', fontsize=16)
plt.axis('equal')  # 使饼图为圆形

plt.show()

直方图

import matplotlib.pyplot as plt
import numpy as np

# 生成正态分布数据
np.random.seed(42)
data = np.random.randn(1000)

# 创建直方图
plt.figure(figsize=(10, 6))
plt.hist(data, bins=30, color='skyblue', edgecolor='black', alpha=0.7)

# 添加标题和标签
plt.title('直方图示例', fontsize=16)
plt.xlabel('数值', fontsize=12)
plt.ylabel('频数', fontsize=12)

# 添加网格
plt.grid(True, linestyle='--', alpha=0.6)

plt.show()

子图

import matplotlib.pyplot as plt
import numpy as np

# 创建 2x2 子图
fig, axes = plt.subplots(2, 2, figsize=(12, 10))

# 子图 1: 折线图
x = np.linspace(0, 10, 100)
axes[0, 0].plot(x, np.sin(x), color='blue')
axes[0, 0].set_title('正弦波')
axes[0, 0].grid(True)

# 子图 2: 柱状图
categories = ['A', 'B', 'C', 'D']
values = [10, 20, 15, 25]
axes[0, 1].bar(categories, values, color='orange')
axes[0, 1].set_title('柱状图')

# 子图 3: 散点图
x = np.random.randn(50)
y = np.random.randn(50)
axes[1, 0].scatter(x, y, color='green', alpha=0.6)
axes[1, 0].set_title('散点图')

# 子图 4: 饼图
sizes = [30, 20, 25, 25]
axes[1, 1].pie(sizes, labels=['A', 'B', 'C', 'D'], autopct='%1.1f%%')
axes[1, 1].set_title('饼图')

plt.tight_layout()
plt.show()

保存图表

import matplotlib.pyplot as plt

# 创建图表
plt.figure(figsize=(10, 6))
plt.plot([1, 2, 3, 4, 5], [2, 4, 6, 8, 10])
plt.title('保存图表示例')

# 保存为不同格式
plt.savefig('chart.png', dpi=300, bbox_inches='tight')  # PNG
plt.savefig('chart.jpg', quality=95)  # JPG
plt.savefig('chart.pdf')  # PDF
plt.savefig('chart.svg')  # SVG

plt.close()

自定义样式

import matplotlib.pyplot as plt

# 设置样式
plt.style.use('seaborn')

# 自定义图表
fig, ax = plt.subplots(figsize=(10, 6))

# 绘制数据
x = [1, 2, 3, 4, 5]
y1 = [2, 4, 6, 8, 10]
y2 = [1, 3, 5, 7, 9]

ax.plot(x, y1, 'b-', linewidth=2, label='数据1')
ax.plot(x, y2, 'r--', linewidth=2, label='数据2')

# 设置标题和标签
ax.set_title('自定义样式图表', fontsize=18, pad=20)
ax.set_xlabel('X 轴', fontsize=14)
ax.set_ylabel('Y 轴', fontsize=14)

# 设置刻度标签大小
ax.tick_params(axis='both', which='major', labelsize=12)

# 添加图例
ax.legend(fontsize=12, loc='upper left')

# 添加网格
ax.grid(True, linestyle='--', alpha=0.7)

plt.tight_layout()
plt.show()
💡 提示:Matplotlib 功能强大,可以创建几乎所有类型的图表,建议结合 Pandas 使用进行数据可视化。

Keras

Keras 是一个高级神经网络 API,运行在 TensorFlow、CNTK 或 Theano 之上,让深度学习变得简单。

安装

pip install tensorflow
# Keras 已集成在 TensorFlow 中

基本神经网络模型

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers

# 创建序列模型
model = keras.Sequential([
    layers.Dense(64, activation='relu', input_shape=(10,)),
    layers.Dense(32, activation='relu'),
    layers.Dense(1, activation='sigmoid')
])

# 编译模型
model.compile(
    optimizer='adam',
    loss='binary_crossentropy',
    metrics=['accuracy']
)

# 查看模型结构
model.summary()

构建分类模型

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers

# 函数式 API 构建
inputs = keras.Input(shape=(784,))
x = layers.Dense(128, activation='relu')(inputs)
x = layers.Dropout(0.2)(x)
x = layers.Dense(64, activation='relu')(x)
outputs = layers.Dense(10, activation='softmax')(x)

# 创建模型
model = keras.Model(inputs=inputs, outputs=outputs)

# 编译模型
model.compile(
    optimizer='adam',
    loss='sparse_categorical_crossentropy',
    metrics=['accuracy']
)

model.summary()

准备数据

import tensorflow as tf
from tensorflow.keras.datasets import mnist

# 加载 MNIST 数据集
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# 归一化数据
x_train = x_train.astype('float32') / 255.0
x_test = x_test.astype('float32') / 255.0

# 展平图像
x_train = x_train.reshape(-1, 784)
x_test = x_test.reshape(-1, 784)

print(f"训练集形状: {x_train.shape}")
print(f"测试集形状: {x_test.shape}")

训练模型

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers

# 创建模型
model = keras.Sequential([
    layers.Dense(128, activation='relu', input_shape=(784,)),
    layers.Dropout(0.2),
    layers.Dense(64, activation='relu'),
    layers.Dense(10, activation='softmax')
])

# 编译模型
model.compile(
    optimizer='adam',
    loss='sparse_categorical_crossentropy',
    metrics=['accuracy']
)

# 训练模型
history = model.fit(
    x_train, y_train,
    epochs=10,
    batch_size=32,
    validation_split=0.2,
    verbose=1
)

评估模型

# 评估模型
test_loss, test_acc = model.evaluate(x_test, y_test, verbose=2)
print(f'\n测试准确率: {test_acc:.4f}')

# 预测
predictions = model.predict(x_test[:5])
predicted_classes = tf.argmax(predictions, axis=1)
print(f"预测结果: {predicted_classes.numpy()}")
print(f"真实标签: {y_test[:5]}")

卷积神经网络 (CNN)

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers

# 创建 CNN 模型
model = keras.Sequential([
    layers.Conv2D(32, (3, 3), activation='relu', input_shape=(28, 28, 1)),
    layers.MaxPooling2D((2, 2)),
    layers.Conv2D(64, (3, 3), activation='relu'),
    layers.MaxPooling2D((2, 2)),
    layers.Conv2D(64, (3, 3), activation='relu'),
    layers.Flatten(),
    layers.Dense(64, activation='relu'),
    layers.Dense(10, activation='softmax')
])

# 编译模型
model.compile(
    optimizer='adam',
    loss='sparse_categorical_crossentropy',
    metrics=['accuracy']
)

model.summary()

使用 CNN 处理图像

import tensorflow as tf
from tensorflow.keras.datasets import mnist

# 加载数据
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# 归一化并添加通道维度
x_train = x_train.astype('float32') / 255.0
x_test = x_test.astype('float32') / 255.0
x_train = x_train.reshape(-1, 28, 28, 1)
x_test = x_test.reshape(-1, 28, 28, 1)

# 训练 CNN 模型
history = model.fit(
    x_train, y_train,
    epochs=5,
    batch_size=64,
    validation_split=0.2
)

# 评估
test_loss, test_acc = model.evaluate(x_test, y_test, verbose=2)
print(f'\n测试准确率: {test_acc:.4f}')

保存和加载模型

# 保存整个模型
model.save('my_model.keras')

# 加载模型
loaded_model = keras.models.load_model('my_model.keras')

# 只保存模型权重
model.save_weights('model_weights.weights')

# 加载权重
model.load_weights('model_weights.weights')

# 保存模型架构
json_string = model.to_json()

# 从 JSON 加载架构
from tensorflow.keras.models import model_from_json
model_architecture = model_from_json(json_string)
model_architecture.load_weights('model_weights.weights')

回调函数

from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping, TensorBoard

# 模型检查点
checkpoint = ModelCheckpoint(
    'best_model.keras',
    monitor='val_loss',
    save_best_only=True,
    mode='min',
    verbose=1
)

# 早停
early_stopping = EarlyStopping(
    monitor='val_loss',
    patience=5,
    restore_best_weights=True
)

# TensorBoard
tensorboard = TensorBoard(log_dir='./logs')

# 训练时使用回调
history = model.fit(
    x_train, y_train,
    epochs=50,
    batch_size=32,
    validation_split=0.2,
    callbacks=[checkpoint, early_stopping, tensorboard]
)

自定义层

import tensorflow as tf
from tensorflow.keras import layers

class CustomLayer(layers.Layer):
    def __init__(self, units=32):
        super(CustomLayer, self).__init__()
        self.units = units

    def build(self, input_shape):
        self.w = self.add_weight(
            shape=(input_shape[-1], self.units),
            initializer='random_normal',
            trainable=True
        )
        self.b = self.add_weight(
            shape=(self.units,),
            initializer='zeros',
            trainable=True
        )

    def call(self, inputs):
        return tf.matmul(inputs, self.w) + self.b

# 使用自定义层
model = keras.Sequential([
    CustomLayer(64),
    layers.Activation('relu'),
    layers.Dense(10, activation='softmax')
])

model.compile(optimizer='adam', loss='sparse_categorical_crossentropy')
model.summary()

迁移学习

from tensorflow.keras.applications import VGG16
from tensorflow.keras import layers, models

# 加载预训练模型(不包括顶层)
base_model = VGG16(weights='imagenet', include_top=False, input_shape=(224, 224, 3))

# 冻结基础模型
base_model.trainable = False

# 添加自定义层
model = models.Sequential([
    base_model,
    layers.Flatten(),
    layers.Dense(256, activation='relu'),
    layers.Dropout(0.5),
    layers.Dense(10, activation='softmax')
])

# 编译模型
model.compile(
    optimizer='adam',
    loss='sparse_categorical_crossentropy',
    metrics=['accuracy']
)

model.summary()

Keras 优势:

  • 🎯 简单易用:API 设计简洁直观
  • 🔧 灵活性强:支持快速原型设计
  • 🚀 高性能:基于 TensorFlow 优化
  • 📚 丰富资源:大量预训练模型
  • 🌐 社区活跃:广泛的使用和支持
💡 提示:Keras 适合快速构建和训练深度学习模型,特别适合初学者和快速原型开发。