HOWTO · Python

如何在 Python 中追加二维数组

学习如何使用原生列表和 NumPy 在 Python 中向二维数组追加值。本指南涵盖了 append()、extend()、numpy.append() 等方法,并附有针对行、列和动态数据的示例。是数据操作和数值计算的理想之选!

本页内容

在 Python 中向二维数组追加值是数据操作、数值计算和数据科学应用中的常见操作。无论你使用的是原生 Python 列表,还是为了效率使用 NumPy,都有多种方法可以向二维数组追加行、列或单个值。本指南探讨了不同的技术、它们的优势和使用场景。

使用嵌套列表(Python 列表)

Python 的内置列表可以将二维数组表示为列表的列表。追加值最简单的方法是使用 append() 方法。

追加新行

array = [[1, 2, 3], [4, 5, 6]]
array.append([7, 8, 9])
print(array)

输出:

[[1, 2, 3],
 [4, 5, 6],
 [7, 8, 9]]

此方法向现有列表添加一个全新的行。当你想通过随时间添加更多数据来动态扩展二维列表时,append() 方法非常有用。不过请注意,为了处理结构化数据,所有行可能需要具有相同的长度。

向现有行追加值

array[0].append(10)
print(array)

输出:

[[1, 2, 3, 10],
 [4, 5, 6],
 [7, 8, 9]]

此方法通过追加一个新元素来修改特定的行。与添加新行不同,此操作只影响指定的行,如果管理不当,可能会导致不规则的列结构。

使用列表推导式

列表推导式提供了一种优雅的方式,可以在二维列表的所有行中追加值。

array = [[1, 2], [3, 4]]
array = [row + [5] for row in array]
print(array)

输出:

[[1, 2, 5],
 [3, 4, 5]]

此方法高效地为每一行添加一个新列。通过遍历每一行并追加一个值,列表推导式确保新列在所有行中均匀添加。

使用 NumPy 数组

NumPy 提供了强大的方法来高效地处理二维数组并向其追加值。但是,在处理包含许多空值的大型数据集时,使用稀疏矩阵可以显著减少内存消耗。了解更多关于 [Python 中的稀疏矩阵]({{relref “/HowTo/Python/sparse matrix in python.en.md”}}) 以及它们如何优化存储。

使用 numpy.append()

import numpy as np

array = np.array([[1, 2], [3, 4]])
array = np.append(array, [[5, 6]], axis=0)
print(array)

输出:

[[1 2]
 [3 4]
 [5 6]]

此方法向 NumPy 数组追加一个新行。numpy.append() 函数在处理大型数据集时非常有用,因为与原生 Python 列表相比,它能确保高效的内存管理。

要追加新列:

array = np.append(array, [[7], [8], [9]], axis=1)
print(array)

输出:

[[1 2 7]
 [3 4 8]
 [5 6 9]]

追加值之后,你可能需要将修改后的数组保存到文件中以备后用。你可以参阅我们的 [将数组写入文本文件]({{relref “/HowTo/Python/write array to a textfile.en.md”}}) 指南,了解高效存储 NumPy 数组的详细信息。

如果在修改 NumPy 数组时遇到索引错误,请参阅我们的 修复 ‘Too Many Indices for Array’ 错误 指南,以排查常见错误。

使用 numpy.hstack() 和 numpy.vstack()

NumPy 的 hstack() 和 vstack() 函数旨在高效地追加列和行。

使用 hstack() 追加列

import numpy as np

array = np.array([[1, 2], [3, 4]])
new_column = np.array([[5], [6]])
result = np.hstack((array, new_column))
print(result)

输出:

[[1 2 5]
 [3 4 6]]

使用 vstack() 追加行

new_row = np.array([[5, 6]])
result = np.vstack((array, new_row))
print(result)

输出:

[[1 2]
 [3 4]
 [5 6]]

这些方法高效,并且在处理大型数据集时值得推荐。与可能需要重构整个数组的 numpy.append() 不同,hstack() 和 vstack() 分别针对列向和行向扩展进行了优化。

如果你处理的是结构化数值数据,你可能还需要转置矩阵以便高效地重塑数据。请查看我们的 在 Python 中转置矩阵 一文。

使用 += 运算符

array = [[1, 2], [3, 4]]
array += [[5, 6]]
print(array)

输出:

[[1, 2],
 [3, 4],
 [5, 6]]

此方法是 append() 的简写,但会就地修改列表。使用 += 可确保新行直接添加,而不创建新的引用,这使其成为处理小型二维列表的高效方法。

使用 extend() 追加多行

array = [[1, 2], [3, 4]]
array.extend([[5, 6], [7, 8]])
print(array)

输出:

[[1, 2],
 [3, 4],
 [5, 6],
 [7, 8]]

这在一次添加多行时非常有用。extend() 方法在将来自不同来源的数据合并到单个二维列表中时特别有帮助。

如果你需要将更新后的列表存储为 CSV 文件,你可以查看我们的 在 Python 中将列表写入 CSV 文件 指南。

使用 insert() 在特定索引处添加行

array = [[1, 2], [3, 4]]
array.insert(1, [5, 6])
print(array)

输出:

[[1, 2],
 [5, 6],
 [3, 4]]

insert() 方法允许在数组内精确放置行。这在处理有序数据集时非常有用,因为新条目需要在不破坏整体结构的情况下插入到特定位置。

使用嵌套循环动态填充二维数组

array = []
for i in range(3):
    row = []
    for j in range(2):
        row.append(i * j)
    array.append(row)
print(array)

输出:

[[0, 0],
 [0, 1],
 [0, 2]]

此方法对于动态生成结构化二维数组非常有用。使用嵌套循环可以完全控制数据的填充方式,这使其成为以编程方式生成矩阵和基于网格的结构的理想之选。

结论

Python 提供了多种向二维数组追加值的方法。如果你使用的是标准列表,append()、extend() 和列表推导式都是有效的选择。对于高性能数值运算,NumPy 的 append()、hstack() 和 vstack() 提供了优化的解决方案。正确的方法取决于你处理的是小型列表还是大规模数值数据。

方法对比

方法 适用场景 灵活性 性能
append() 添加行(Python 列表) 高 中等
list comprehension 添加列(Python 列表) 中等 高
numpy.append() 追加行/列(NumPy) 高 高
hstack() / vstack() 高效追加行/列(NumPy) 高 非常高
+= 运算符 快速追加行(Python 列表) 低 高
extend() 追加多行(Python 列表) 中等 高
insert() 在特定索引处插入(Python 列表) 中等 中等
嵌套循环 动态数据生成 高 可变