Python - 不等尺寸矩阵列最小值


在 Python 中,当处理行长度不一的矩阵时,找到每列最小值的效率至关重要。有多种方法可以解决此任务,每种方法都有其自身的优势和适用场景。本文将深入探讨几种方法:从基本的嵌套循环到高级工具,如 NumPy 和 Pandas。

最终,您将全面掌握两项关键技能:掌握不等尺寸矩阵的操作以及从中提取有价值的信息。

方法 1:使用嵌套循环

此方法使用嵌套循环遍历矩阵,并仔细记录每列的最小值。虽然此方法对于较小的矩阵有效,但当应用于较大的数据集时,其效率可能会下降。

示例

matrix = [
   [3, 8, 1],
   [4, 2],
   [9, 6, 5, 7]
]
max_row_length = max(len(row) for row in matrix)

column_minima = [float('inf')] * max_row_length

for row in matrix:
   for i, value in enumerate(row):
      # Update the minimum value for each column
      column_minima[i] = min(column_minima[i], value)

for i, minimum in enumerate(column_minima):
   print(f"Minimum value in column {i}: {minimum}")

输出

Minimum value in column 0: 3
Minimum value in column 1: 2
Minimum value in column 2: 1
Minimum value in column 3: 7

方法 2:使用 NumPy

使用 NumPy 可以高效地处理矩阵:创建一个填充 NaN 值的数组,然后用矩阵数据填充此数组。随后使用 np.nanmin 可以识别每列的最小值,从而证实 NumPy 在处理数值数据方面表现出色。

示例

import numpy as np

matrix = [
   [3, 8, 1],
   [4, 2],
   [9, 6, 5, 7]
]
max_row_length = max(len(row) for row in matrix)

# Create a NumPy array filled with NaN values
np_matrix = np.empty((len(matrix), max_row_length))
np_matrix[:] = np.nan

# Fill the NumPy array with matrix values
for i, row in enumerate(matrix):
   np_matrix[i, :len(row)] = row

# Find the minimum values in each column
column_minima = np.nanmin(np_matrix, axis=0)

# Print the minimum values for each column
for i, minimum in enumerate(column_minima):
   print(f"Minimum value in column {i}: {int(minimum)}")

输出

Minimum value in column 0: 3
Minimum value in column 1: 2
Minimum value in column 2: 1
Minimum value in column 3: 7

方法 3:使用列表推导式

使用列表推导式是确定每列最小值的一种巧妙方法:它迭代遍历矩阵,为每一列生成一个最小值的列表。这种系统化的方法不仅简化了可读性,还提高了效率,因此使其成为一种最佳方法。

示例

matrix = [
   [3, 8, 1],
   [4, 2],
   [9, 6, 5, 7]
]
column_minima = [min(row[i] for row in matrix if i < len(row)) for i in range(max(len(row) for row in matrix))]

for i, minimum in enumerate(column_minima):
   print(f"Minimum value in column {i}: {minimum}")

输出

Minimum value in column 0: 3
Minimum value in column 1: 2
Minimum value in column 2: 1
Minimum value in column 3: 7

方法 4:使用 itertools.zip_longest

使用 Python 的 itertools 库,此代码片段识别可变大小矩阵中每列的最小值:首先,它转置该矩阵,使用 zip_longest 解包其行,从而确保所有列都具有相同的长度,方法是用 float('inf') 填充任何缺失的值。然后,它通过使用列表推导式计算每列的最小值。最后,程序遍历生成的列最小值列表,并打印它们——此过程会产生一个输出,该输出显示原始矩阵中每列的最小值。

示例

from itertools import zip_longest

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

# Transpose the matrix and use zip_longest
transposed = zip_longest(*matrix, fillvalue=float('inf'))

column_minima = [min(col) for col in transposed]

for i, minimum in enumerate(column_minima):
   print(f"Minimum value in column {i}: {minimum}")

输出

Minimum value in column 0: 3
Minimum value in column 1: 2
Minimum value in column 2: 1
Minimum value in column 3: 7

方法 5:使用自定义函数

我们创建一个自定义函数来查找每列中的最小值;它通过迭代矩阵来运行,并在其过程中维护一个每列最小值的列表。此方法提供的灵活性和自定义选项值得注意:它们极大地提升了我们对数据管理的方法。

示例

def min_values_in_columns(matrix):
   column_minima = [float('inf')] * max(len(row) for row in matrix)
   for row in matrix:
      for i, value in enumerate(row):
         column_minima[i] = min(column_minima[i], value)
   return column_minima

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

column_minima = min_values_in_columns(matrix)

for i, minimum in enumerate(column_minima):
   print(f"Minimum value in column {i}: {minimum}")

输出

Minimum value in column 0: 3
Minimum value in column 1: 2
Minimum value in column 2: 1
Minimum value in column 3: 7

方法 6:使用 defaultdict

collections 模块的 defaultdict 简化了查找每列最小值的步骤:它循环遍历矩阵,在其类似字典的配置中系统地更新每列的最小值。

示例

from collections import defaultdict

matrix = [
   [3, 8, 1],
   [4, 2],
   [9, 6, 5, 7]
]
column_minima = defaultdict(lambda: float('inf'))

for row in matrix:
   for i, value in enumerate(row):
      column_minima[i] = min(column_minima[i], value)
for i, minimum in column_minima.items():
   print(f"Minimum value in column {i}: {minimum}")

输出

Minimum value in column 0: 3
Minimum value in column 1: 2
Minimum value in column 2: 1
Minimum value in column 3: 7

方法 7:使用 Pandas

Pandas - 这是一个用于数据操作的功能强大的库。通过从矩阵创建 Pandas DataFrame,我们使用 min 函数来确定每列的最小值——Pandas 在处理结构化数据时尤其擅长此任务。

示例

import pandas as pd

matrix = [
   [3, 8, 1],
   [4, 2],
   [9, 6, 5, 7]
]
df = pd.DataFrame(matrix)

column_minima = df.min()

for i, minimum in enumerate(column_minima):
   print(f"Minimum value in column {i}: {int(minimum)}")

输出

Minimum value in column 0: 3
Minimum value in column 1: 2
Minimum value in column 2: 1
Minimum value in column 3: 7

结论

在我们探索各种查找不等尺寸矩阵中每列最小值的方法,特别是使用 Python 时:我们遇到了各种策略,从简单的嵌套循环和列表推导式到专门的工具,如 NumPy 和 Pandas。您选择的方法应取决于两个主要因素:您数据固有的独特特征;以及与您的任务相关的性能要求。优先考虑可读性、数值效率或多功能性;每种方法都值得一试——一种可以巧妙地处理适合您需求的各种矩阵结构的方法。

更新于: 2023-11-02

109 次浏览

开启您的 职业生涯

通过完成课程获得认证

开始学习
广告