5 min read
List、Tuple 与 NumPy Array 的设计哲学与核心操作
深入比较一下 Python 中三种核心数据结构——List (列表)、Tuple (元组) 和 NumPy Array (数组) 的设计理念。
views
| comments
这三种数据结构在 Python 生态系统中都用于存储数据集合,但它们的设计哲学和侧重点有显著不同。
| 特性 | Python List (列表) | Python Tuple (元组) | NumPy Array (数组) |
|---|---|---|---|
| 可变性 (Mutability) | 可变 (Mutable):创建后可以修改、添加或删除元素。 | 不可变 (Immutable):创建后不能修改、添加或删除元素。 | 通常可变 (Mutable):元素的值可以修改。但大小是固定的,修改形状或数据类型需要创建新数组。 |
| 元素类型 | 异构 (Heterogeneous):可以存储不同类型的数据 (如 int, str, float)。 | 异构 (Heterogeneous):可以存储不同类型的数据。 | 同构 (Homogeneous):所有元素必须是相同类型的(如 numpy.int64)。 |
| 用途/设计侧重 | 通用序列:用于存储任何类型的有序集合,灵活且功能丰富,但效率非最高。 | 数据记录:用于存储相关联但类型可能不同的数据项的集合,保护数据的完整性。 | 科学计算/数值计算:专为高效存储和操作大型同构数值数据集而设计,支持向量化操作。 |
| 内存/效率 | 存储开销大,因为需要存储每个元素的类型信息和引用。速度相对较慢。 | 存储开销与 List 类似,但由于不可变,在某些情况下略快,可作为字典键使用。 | 内存连续且紧凑,存储效率极高。底层用 C 语言实现,计算速度极快(尤其是对大型数组的批量操作)。 |
| 维度 | 仅一维。若要表示多维数据,需要使用嵌套 List。 | 仅一维。若要表示多维数据,需要使用嵌套 Tuple。 | 多维数组 (N-dimensional Array):支持从 1D 到 N-D 的任意维度。 |
1. List (列表)#
List 是最灵活的序列类型,支持原地修改操作。
- 创建:
my_list = [1, 'two', 3.0] - 访问/切片:
my_list[0](第一个元素),my_list[1:3](切片) - 修改:
my_list[0] = 10(原地修改元素) - 添加:
my_list.append(4)(末尾添加),my_list.insert(1, 'new')(指定位置插入) - 删除:
my_list.pop()(删除并返回最后一个),my_list.remove('new')(删除第一个匹配值),del my_list[0] - 查找/计数:
my_list.index(3.0),my_list.count(1) - 排序:
my_list.sort()(原地排序),sorted(my_list)(返回新列表) - 连接/复制:
list1 + list2(连接),list1.copy()(浅拷贝)
2. Tuple (元组)#
Tuple 是不可变序列,操作主要围绕访问、查找和创建新的 Tuple。
- 创建:
my_tuple = (1, 'two', 3.0)或my_tuple = 1, 'two', 3.0 - 访问/切片:
my_tuple[0],my_tuple[1:3](与 List 相同) - 查找/计数:
my_tuple.index(3.0),my_tuple.count(1)(与 List 相同) - 解包:
a, b, c = my_tuple - 连接/重复:
tuple1 + tuple2(连接),tuple1 * 3(重复)
注意: Tuple 不支持
append(),insert(),pop(),remove(),sort()等原地修改操作。
3. NumPy Array (数组)#
NumPy Array 核心在于向量化和广播,实现高效的数值计算。
- 创建:
import numpy as np,my_array = np.array([1, 2, 3]),np.zeros((2, 3))(创建全零矩阵),np.arange(5)(创建等差数组) - 属性查询:
my_array.shape(形状),my_array.dtype(数据类型),my_array.ndim(维度) - 访问/切片:
my_array[0, 1](多维访问), 布尔索引 (my_array[my_array > 2]) - 形状操作:
my_array.reshape(new_shape)(返回新形状数组),my_array.T(转置) - 元素级运算 (向量化):
array1 + array2,array1 * 2,np.sin(array1)(比 List 循环快得多) - 聚合操作:
my_array.sum(),my_array.mean(),my_array.std()(标准差),my_array.max(axis=0)(沿指定轴的最大值) - 连接/分割:
np.concatenate((a, b), axis=0),np.split(array, 2)