Python - 不等长列表的列求和
什么是列求和
列求和指的是计算数据集或矩阵中每一列的值之和的过程。在数据分析或数值计算的背景下,列求和是用于沿垂直轴汇总和分析数据的常用操作。
例如,考虑一个以表格形式表示的数据集,其中包含行和列。每一列对应一个变量或特征,每一行对应一个观测值或数据点。列求和涉及将每一列中的值加起来,以获得每个变量的单个总和。让我们用一个例子来说明这一点。
假设我们有以下数据集,表示五个人在三次不同测量中的身高(以厘米为单位)。
测量 1 | 测量 2 | 测量 3 | |
0 | 170 | 175 | 180 |
1 | 165 | 168 | 172 |
2 | 180 | 182 | 178 |
3 | 172 | 169 | 171 |
4 | 175 | 176 | 174 |
要计算列求和,我们必须将每一列中的值加起来。
列求和
测量 1:862
测量 2:870
测量 3:875
在这种情况下,列求和提供了每次测量的总高度,使我们能够概览每个变量中的累积值。
当您拥有不等长的列表并希望在 Python 中计算每一列的列总和时,我们可以使用不同的方法。以下列出了三种实现此目的的方法。
使用循环和填充列表
在这种方法中,我们可以循环遍历列表并对每一列的值求和,同时考虑列表的长度可能不同。我们需要用零填充较短的列表以使其长度相等。
示例
在此示例中,我们首先使用`max(len(lst) for lst in lists)`找到所有列表中的最大长度。然后,我们使用列表推导式用零填充每个列表以匹配最大长度。填充后,我们可以使用`zip(*padded_lists)`转置列表,最后,我们使用另一个列表推导式计算列总和。
lists = [ [1, 2, 3], [4, 5], [6, 7, 8, 9] ] max_length = max(len(lst) for lst in lists) padded_lists = [lst + [0] * (max_length - len(lst)) for lst in lists] column_sum = [sum(col) for col in zip(*padded_lists)] print("The column summation of uneven sized lists:",column_sum)
输出
The column summation of uneven sized lists: [11, 14, 11, 9]
使用 Itertools.zip_longest() 函数
来自 `itertools` 模块的`zip_longest`函数允许我们将不等长列表压缩在一起,并用指定默认值(在本例中为 0)填充缺失的值。
示例
在此示例中,`zip_longest(*lists, fillvalue=0)`用填充压缩列表,然后我们使用列表推导式计算列总和,这与之前的方法类似。
from itertools import zip_longest lists = [ [1, 2, 3], [4, 5], [6, 7, 8, 9, 10] ] column_sum = [sum(col) for col in zip_longest(*lists, fillvalue=0)] print("The column summation of uneven sized lists:",column_sum)
输出
The column summation of uneven sized lists: [11, 14, 11, 9, 10]
使用 NumPy
NumPy提供了一种优雅的方法来处理不等长列表,而无需显式填充。即使列表长度不同,它也会自动广播列表以执行求和操作。
示例
在此示例中,我们使用`np.array(lists)`将列表列表转换为 NumPy 数组,其中每一行表示一个列表。然后,我们使用`np.sum(arr, axis=0)`沿第一个轴(即行)计算总和,这有效地为我们提供了列总和。
import numpy as np lists = [ [1, 2, 3], [4, 5], [6, 7, 8, 9] ] arr = np.array(lists, dtype=object ) column_sum = np.sum(arr, axis=0) print("The column summation of uneven sized lists:",column_sum)
输出
The column summation of uneven sized lists: [1, 2, 3, 4, 5, 6, 7, 8, 9]