Python 有两种主要的 "array":

- 内置的
list(列表):这是 Python 最常用、最灵活的数据结构,它可以存储任意类型的元素(数字、字符串、对象等),并且大小是动态的,你不需要预先指定其大小。 array模块中的array(数组):这是 Python 标准库array提供的一种数据结构,它只能存储同一种基本数据类型(如整数、浮点数等),并且比list更节省内存,访问速度更快,它更像 C 语言或 Java 中的数组。
还有一个非常强大的第三方库叫做 NumPy,它提供了 numpy.ndarray(N 维数组),这是科学计算、数据分析和机器学习领域的事实标准,它的性能远超 list 和 array 模块。
转换关系可以分为以下几种情况:
list↔array.arraylist↔numpy.ndarrayarray.array↔numpy.ndarray
下面我们一一详细说明。
list 与 array.array 之间的转换
array.array 是标准库的一部分,使用前需要导入。

将 list 转换为 array.array
使用 array.array() 构造函数,并指定一个类型码(type code)来告诉数组要存储哪种数据类型。
常用类型码:
'b': 有符号整数 (字节)'B': 无符号整数 (字节)'u': Unicode 字符 (已弃用)'h': 有符号短整型'i': 有符号整型'l': 有符号长整型'f': 单精度浮点数'd': 双精度浮点数
示例代码:
import array
# 1. 将整数列表转换为整数数组
my_list = [1, 2, 3, 4, 5]
# 'i' 代表 signed integer (有符号整型)
my_array = array.array('i', my_list)
print(f"List: {my_list}")
print(f"Array: {my_array}")
print(f"Type of array: {type(my_array)}")
print("-" * 20)
# 2. 将浮点数列表转换为浮点数数组
float_list = [1.1, 2.2, 3.3, 4.4]
# 'd' 代表 double (双精度浮点数)
float_array = array.array('d', float_list)
print(f"Float List: {float_list}")
print(f"Float Array: {float_array}")
print(f"Type of float array: {type(float_array)}")
输出:

List: [1, 2, 3, 4, 5]
Array: array('i', [1, 2, 3, 4, 5])
Type of array: <class 'array.array'>
--------------------
Float List: [1.1, 2.2, 3.3, 4.4]
Float Array: array('d', [1.1, 2.2, 3.3, 4.4])
Type of float array: <class 'array.array'>
将 array.array 转换为 list
转换非常简单,直接使用 list() 构造函数即可。
示例代码:
import array
# 假设我们有一个 array
my_array = array.array('i', [10, 20, 30, 40, 50])
# 将 array 转换为 list
my_list_back = list(my_array)
print(f"Original Array: {my_array}")
print(f"Converted List: {my_list_back}")
print(f"Type of converted list: {type(my_list_back)}")
输出:
Original Array: array('i', [10, 20, 30, 40, 50])
Converted List: [10, 20, 30, 40, 50]
Type of converted list: <class 'list'>
list 与 numpy.ndarray 之间的转换
这是在数据科学领域最常见的转换,NumPy 是一个第三方库,你需要先安装它。
安装 NumPy:
pip install numpy
将 list 转换为 numpy.ndarray
使用 numpy.array() 函数。
示例代码:
import numpy as np
# 1. 将一维列表转换为 NumPy 数组
my_list = [1, 2, 3, 4, 5]
np_array_1d = np.array(my_list)
print(f"List: {my_list}")
print(f"NumPy Array: {np_array_1d}")
print(f"Type of NumPy array: {type(np_array_1d)}")
print(f"Data type of NumPy array: {np_array_1d.dtype}") # 查看数据类型
print("-" * 20)
# 2. 将嵌套列表(二维)转换为 NumPy 数组
matrix_list = [[1, 2, 3], [4, 5, 6]]
np_array_2d = np.array(matrix_list)
print(f"Matrix List: {matrix_list}")
print(f"NumPy 2D Array:\n{np_array_2d}")
print(f"Shape of NumPy array: {np_array_2d.shape}") # 查看形状
输出:
List: [1, 2, 3, 4, 5]
NumPy Array: [1 2 3 4 5]
Type of NumPy array: <class 'numpy.ndarray'>
Data type of NumPy array: int64
--------------------
Matrix List: [[1, 2, 3], [4, 5, 6]]
NumPy 2D Array:
[[1 2 3]
[4 5 6]]
Shape of NumPy array: (2, 3)
将 numpy.ndarray 转换为 list
同样,使用 list() 函数,对于多维数组,它会转换为一个嵌套的 list。
示例代码:
import numpy as np
# 假设我们有一个 NumPy 数组
np_array = np.array([[1, 2], [3, 4]])
# 将 NumPy 数组转换为 list
list_back = list(np_array)
print(f"Original NumPy Array:\n{np_array}")
print(f"Converted List: {list_back}")
print(f"Type of converted list: {type(list_back)}")
# 注意:对于多维数组,list() 会创建一个数组的列表
# 要完全转换为嵌套的 Python list,可以这样做
nested_list = np_array.tolist()
print(f"Fully nested list: {nested_list}")
print(f"Type of fully nested list: {type(nested_list)}")
输出:
Original NumPy Array:
[[1 2]
[3 4]]
Converted List: [array([1, 2]), array([3, 4])]
Type of converted list: <class 'list'>
Fully nested list: [[1, 2], [3, 4]]
Type of fully nested list: <class 'list'>
重要提示:直接对多维 NumPy 数组使用 list() 会得到一个包含 NumPy 数组的列表,通常我们想要的是完全嵌套的 Python list,这时应该使用 .tolist() 方法,如上例所示。
array.array 与 numpy.ndarray 之间的转换
这两种都是数组结构,转换也很直接。
将 array.array 转换为 numpy.ndarray
直接将 array.array 对象传递给 np.array()。
示例代码:
import array
import numpy as np
# 创建一个 array.array
my_array = array.array('d', [1.1, 2.2, 3.3])
# 将 array.array 转换为 numpy.ndarray
np_array_from_array = np.array(my_array)
print(f"Original array.array: {my_array}")
print(f"Converted NumPy Array: {np_array_from_array}")
print(f"Type: {type(np_array_from_array)}")
输出:
Original array.array: array('d', [1.1, 2.2, 3.3])
Converted NumPy Array: [1.1 2.2 3.3]
Type: <class 'numpy.ndarray'>
将 numpy.ndarray 转换为 array.array
可以使用 array.array() 构造函数,并指定类型码,一个方便的方法是使用 ndarray.dtype.char 来获取 NumPy 数据类型对应的 array 类型码。
示例代码:
import array
import numpy as np
# 创建一个 NumPy 数组
np_array = np.array([10, 20, 30, 40], dtype=np.int32)
# 将 numpy.ndarray 转换为 array.array
# 'i' 通常对应于 int32
my_array_back = array.array(np_array.dtype.char, np_array)
print(f"Original NumPy Array: {np_array}")
print(f"Converted array.array: {my_array_back}")
print(f"Type: {type(my_array_back)}")
输出:
Original NumPy Array: [10 20 30 40]
Converted array.array: array('i', [10, 20, 30, 40])
Type: <class 'array.array'>
总结与对比
| 特性 | list (列表) |
array.array (数组模块) |
numpy.ndarray (NumPy 数组) |
|---|---|---|---|
| 类型 | Python 内置 | Python 标准库 | 第三方库 (NumPy) |
| 元素类型 | 可混合(任意类型) | 必须单一(基本类型) | 必须单一(基本类型) |
| 性能 | 较慢(通用目的) | 较快(针对数值计算) | 极快(高度优化,C 语言实现) |
| 功能 | 通用,方法丰富 | 基本的数组操作 | 极其丰富(线性代数、统计、傅里叶变换等) |
| 内存占用 | 较高 | 较低 | 非常低 |
| 适用场景 | 通用编程,存储异构数据 | 需要节省内存的简单数值序列 | 科学计算、数据分析、机器学习、大规模数值计算 |
如何选择?
- 如果只是存储少量数据,数据类型不一,或者只是进行一些简单的列表操作:直接用
list,这是最 Pythonic 的方式。 - 如果你需要处理一个大的、单一类型的数值序列,并且关心内存使用,但又不想引入 NumPy 这个重型库:使用
array.array。 - 如果你在进行任何形式的科学计算、数据分析、机器学习,或者对性能有极高要求,需要处理大规模多维数据:毫不犹豫地选择 NumPy 的
ndarray,它是 Python 数值计算领域的基石。
