杰瑞科技汇

Python list和array如何高效转换?

Python 有两种主要的 "array":

Python list和array如何高效转换?-图1
(图片来源网络,侵删)
  1. 内置的 list(列表):这是 Python 最常用、最灵活的数据结构,它可以存储任意类型的元素(数字、字符串、对象等),并且大小是动态的,你不需要预先指定其大小。
  2. array 模块中的 array(数组):这是 Python 标准库 array 提供的一种数据结构,它只能存储同一种基本数据类型(如整数、浮点数等),并且比 list 更节省内存,访问速度更快,它更像 C 语言或 Java 中的数组。

还有一个非常强大的第三方库叫做 NumPy,它提供了 numpy.ndarray(N 维数组),这是科学计算、数据分析和机器学习领域的事实标准,它的性能远超 listarray 模块。

转换关系可以分为以下几种情况:

  • listarray.array
  • listnumpy.ndarray
  • array.arraynumpy.ndarray

下面我们一一详细说明。


listarray.array 之间的转换

array.array 是标准库的一部分,使用前需要导入。

Python list和array如何高效转换?-图2
(图片来源网络,侵删)

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)}")

输出:

Python list和array如何高效转换?-图3
(图片来源网络,侵删)
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'>

listnumpy.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.arraynumpy.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 数值计算领域的基石。
分享:
扫描分享到社交APP
上一篇
下一篇