HOWTO · NumPy

将 NumPy 数组转换为元组

有两种主要方法可用于将 NumPy 数组转换为 Python 中的元组,即 tuple() 函数和 map() 函数。

本页内容

使用 Python 内置的 tuple() 函数将 NumPy 数组转换为元组。一维数组可通过 tuple(array) 转换为包含其元素的元组。若要将二维数组转换为嵌套元组,还需逐行转换。下面的示例展示了这两种结构,以及使用 map() 的替代方法。

将一维 NumPy 数组转换为元组

tuple() 会遍历一个可迭代对象,并将其产生的元素放入元组中。遍历一维 NumPy 数组时会依次得到数组中的值,因此直接将数组传给 tuple() 就能得到一维元组。下面的示例使用 NumPy 整数;它们的显示形式可能因 NumPy 版本而异。

运行此示例:

本节中的代码以及显示的标签或输出仍为英文。

import numpy as np

array = np.array([10, 20, 30])
result = tuple(array)
print(result)
(np.int64(10), np.int64(20), np.int64(30))

将二维 NumPy 数组转换为嵌套元组

遍历二维数组时会逐行得到各行。因此,tuple(matrix) 会生成一个外层元组,但其中的元素仍是 NumPy 行数组。若要连同各行一起转换,请将每一行传给 tuple()。这样可以保留结果中原有的行列分组。

本节中的代码以及显示的标签或输出仍为英文。

import numpy as np

matrix = np.array([[1, 2], [3, 4]])
result = tuple(tuple(row) for row in matrix)
print(result)
((np.int64(1), np.int64(2)), (np.int64(3), np.int64(4)))

列表推导式会逐行执行一次内层转换,然后由外层 tuple() 收集这些行元组。NumPy 标量的显示形式可能因版本而异。

使用 map() 转换每一行

也可以使用 map(tuple, matrix) 来执行相同的逐行操作。在 Python 中,map() 会返回一个迭代器,因此需要用 tuple() 包裹它,才能一次性生成所有转换后的行。如果操作只是对每一行应用 tuple(),这种写法会更简洁。

本节中的代码以及显示的标签或输出仍为英文。

import numpy as np

matrix = np.array([[1, 2], [3, 4]])
result = tuple(map(tuple, matrix))
print(result)
((np.int64(1), np.int64(2)), (np.int64(3), np.int64(4)))

这里的 map() 转换的是各行,而不是每个标量值。如果要逐元素转换值,可以改用其他表达式;例如,将一维数组中的值转换为 Python 整数时,可以写成 tuple(int(value) for value in array)。应根据要转换的是行还是值来选择相应的方法。

根据所需结果选择转换方法

若要得到一维序列,请使用 tuple(array)。对于二维数组,如果希望每一行仍是独立的元组,可以使用 tuple(tuple(row) for row in matrix) 这样的嵌套转换,或使用等效的 map() 写法。这些方法都能保留各行之间的分组。

元组不会保留 NumPy 数组的属性,例如 shape 属性或数组运算能力。元组的嵌套结构反映了转换后的行,但它并不是 NumPy 的形状元数据。如果任务需要将所有值合并为一个序列,可以选择使用数组方法展平;这会丢弃行分组并改变结构。创建嵌套元组时不需要展平。

此外,将数组转换为元组并不保证每个元素都会变成原生 Python 标量。NumPy 值仍可能是 NumPy 标量对象。只有在后续代码需要特定类型时,才使用 int() 等显式转换,并选择适合实际值的转换方式。NumPy 标量的显示形式可能因版本而异。