--- tid: 31n42i title: 2d List --- # 2d List (date: 2025-11-01) **难度**: 2 时长: 30 min ## List of Lists (混合结构) 如何创建这个 List ? ![](images/list-of-lists.png) 可以做到,但并不推荐! ## 列表如何嵌套和解套 ![image](img/deep-list.png) [放大](img/deep-list-ori.png) 视角从外层往内层 (从高层往低层),对应括号从左往右。 ``` x = [[1,2,3], 4] ``` ### 练习 1. 修改值为3的元素,其新值改为6; 2. 把值为4的元素的值改为 (4,5,6); 3. 现在值为5的元素是否能被修改成 10 ? ## 2d List (List of Lists) ![](images/list-of-lists-2d.jpg) ```python lst = [[1,2,3], [4,5,6], [7,8,9]] ``` ### 练习 1. 将第1行中的第2个元素修改为 10; 2. 将第2行中的第1个元素 *10; 3. 将第3行中的第3个元素 +10; 4. 将所有成员都乘以 2 ## Numpy 2d Array NumPy 是 Python 中用于科学计算的核心库,提供了高性能的多维数组对象。与 Python 的 2D List 相比,NumPy 数组在性能和功能上都有显著优势。 ### 创建 NumPy 2D 数组 ```python import numpy as np # 从列表创建 2D 数组 lst = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] arr = np.array(lst) print(arr) # 输出: # [[1 2 3] # [4 5 6] # [7 8 9]] ``` ### 基本操作示例 ```python # 创建相同的 3x3 数组 arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 访问元素 print(arr[0, 1]) # 输出: 2 (第1行第2列) print(arr[1, 0]) # 输出: 4 (第2行第1列) print(arr[2, 2]) # 输出: 9 (第3行第3列) # 修改元素 arr[0, 1] = 10 # 将第1行第2列改为10 arr[1, 0] *= 10 # 将第2行第1列乘以10 arr[2, 2] += 10 # 将第3行第3列加10 print(arr) # 输出: # [[ 1 10 3] # [40 5 6] # [ 7 8 19]] ``` ### 数组运算 ```python # 创建相同的 3x3 数组 arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) # 数学运算 print(arr + 10) # 每个元素加10 print(arr * 2) # 每个元素乘以2 print(arr ** 2) # 每个元素平方 # 矩阵运算 print(arr.T) # 转置矩阵 print(np.sum(arr)) # 所有元素求和 print(np.mean(arr)) # 所有元素平均值 ``` ## 2d List vs 2d Array ### 主要区别 | 特性 | 2D List | NumPy 2D Array | |------|---------|----------------| | **性能** | 较慢,适合小规模数据 | 快速,适合大规模数值计算 | | **内存使用** | 较高,每个元素都是对象 | 较低,元素是原生数据类型 | | **数据类型** | 可以混合类型 | 通常要求统一数据类型 | | **运算支持** | 需要循环遍历 | 支持向量化运算 | | **功能丰富度** | 基本操作 | 丰富的数学和科学计算函数 | ### 性能对比示例 ```python import numpy as np import time # 使用相同的 3x3 数据 data = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] # 2D List 运算 start = time.time() result_list = [] for row in data: new_row = [x * 2 for x in row] result_list.append(new_row) list_time = time.time() - start # NumPy 数组运算 arr = np.array(data) start = time.time() result_arr = arr * 2 numpy_time = time.time() - start print(f"2D List 耗时: {list_time:.6f}秒") print(f"NumPy 数组耗时: {numpy_time:.6f}秒") ``` ### 适用场景 **使用 2D List 的情况:** - 数据量较小 - 需要混合数据类型 - 简单的数据结构操作 - 不需要复杂的数学运算 **使用 NumPy 2D Array 的情况:** - 大规模数值计算 - 科学计算和数据分析 - 需要高性能的矩阵运算 - 机器学习算法实现 ### 转换示例 ```python # 2D List 转 NumPy 数组 lst = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] arr = np.array(lst) # NumPy 数组转 2D List arr_back = arr.tolist() print("原始列表:", lst) print("NumPy 数组:", arr) print("转换回列表:", arr_back) ```