
上次笔记,完成了第十七章Numpy的练习题,正式结束Numpy关于线性代数这块的知识。
今天新开第十八章Numpy爱因斯坦求和约定。按照作者的定位,这章也是略读即可。先附上思维导图和作者讲解视频:

【Chapter 17 NumPy线性代数 | 《编程不难》 | 鸢尾花书:从加减乘除到机器学习】 https://www.bilibili.com/video/BV1VD421L7Hf/
今天打算更一下18.1-18.2的部分:


import numpy as np# 创建两个矩阵A = np.array([[1, 2], [3, 4]])B = np.array([[5, 6], [7, 8]])# 传统矩阵乘法C_traditional = A @ Bprint("传统矩阵乘法结果:")print(C_traditional)# 爱因斯坦求和约定C_einsum = np.einsum('ij,jk->ik', A, B)print("\n爱因斯坦求和约定结果:")print(C_einsum)

import numpy as npfrom sklearn.datasets import load_iris# 加载鸢尾花数据集iris = load_iris()X = iris.data # 形状(150, 4)print(f"鸢尾花数据集形状: {X.shape}")print(f"前5行数据:\n{X[:5]}")# 1. 所有元素求和total_sum = np.einsum('ij->', X)print(f"\n1. 所有元素总和: {total_sum:.2f}")print(f" 验证(np.sum): {np.sum(X):.2f}")# 2. 每一列求和(特征求和)col_sum = np.einsum('ij->j', X)print(f"\n2. 每一列求和:")for i, val in enumerate(col_sum):print(f" 特征{i+1}: {val:.2f}")print(f" 验证(np.sum, axis=0): {np.sum(X, axis=0)}")# 3. 每一行求和(样本求和)row_sum = np.einsum('ij->i', X)print(f"\n3. 每一行求和(前5个样本):")for i, val in enumerate(row_sum[:5]):print(f" 样本{i+1}: {val:.2f}")print(f" 验证(np.sum, axis=1)[:5]: {np.sum(X, axis=1)[:5]}")# 4. 提取对角线元素(对格拉姆矩阵)G = X.T @ Xdiag_elements = np.einsum('ii->i', G)print(f"\n4. 格拉姆矩阵对角线元素(特征平方和):")for i, val in enumerate(diag_elements):print(f" 特征{i+1}平方和: {val:.2f}")# 5. 计算格拉姆矩阵的迹trace_G = np.einsum('ii->', G)print(f"\n5. 格拉姆矩阵的迹: {trace_G:.2f}")print(f" 验证(np.trace): {np.trace(G):.2f}")求和运算的可视化理解



# 比较不同方法的计算效率import time# 方法1:使用循环def sum_with_loops(X):total = 0for i in range(X.shape[0]):for j in range(X.shape[1]):total += X[i, j]return total# 方法2:使用NumPy内置函数def sum_with_numpy(X):return np.sum(X)# 方法3:使用爱因斯坦求和def sum_with_einsum(X):return np.einsum('ij->', X)# 测试性能X_large = np.random.randn(1000, 1000)methods = [sum_with_loops, sum_with_numpy, sum_with_einsum]names = ["循环", "NumPy", "爱因斯坦"]for func, name in zip(methods, names):start = time.time()result = func(X_large)elapsed = time.time() - startprint(f"{name}方法: 结果={result:.2f}, 耗时={elapsed:.4f}秒")
---
笔记写于:2026年4月24日16:37:25
结束于:2026年4月24日17:07:25
用时:约半小时
--